(13)Cookie三天免登录案例(附源码)

(13)Cookie三天免登录案例(附源码)

前言

我的上一篇博客我们学会了用Cookie对象,这次我们做个小案例,用Cookie做一个三天免登录。

我们会用到上次的那个案例:第三个Web项目(Servlet登录案例 - 附源码)

dao、pojo和service都一样。不同的是Servlet包下的代码。

为了减少代码冗余相同的代码我就不贴上来了,如:dao、pojo和service。

同时Servlet包下的代码会继续放在示例代码中。

注意:我为了尽可能的简单描述Cookie的使用,代码可能只是简单的作为一个参考。具体的情况需要具体分析!

一、创建项目

1.包结构

和上次的一样,修改的只是servlet包下的类而已。
在这里插入图片描述

2.示例代码

LoginPageServlet类:返回一个登录页面。

在这个页面中判断了是否三天免登录。

如果Cookie中有三天免登,那么就直接返回登录成功页面。否则继续去登录页面登录。

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 返回一个登录页面
 * 
 * @author changsheng
 */
@WebServlet("/LoginPageServlet")
public class LoginPageServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置响应编码格式,返回html
		resp.setHeader("content-type", "text/html;charset=utf-8");
		// 判断Cookie中是否有三天免登,如果有直接登录成功,就不需要进行下面的操作了。
		Cookie[] cookies = req.getCookies();
		boolean isAvoidLogin = false; // 不是免登录
		if (null != cookies) { // 有Cookie才遍历
			for (int i = 0; i < cookies.length; i++) {
				String name = cookies[i].getName();
				if (name.equals("cookieUsername")) { // Cookie中cookieUsername的存在。那么说明还在免登录期间
					isAvoidLogin = true; // 免登录
				}
			}
		}
		if (isAvoidLogin) { // 免登录
			resp.getWriter().append("登录成功!");
			System.out.println("Cookie信息还在,三天免登录成功!");
			return;
		}
		// 没有三天免登录,请登录
		// 下面是即将响应的html代码(等后面学JSP后就不会这样写了)
		StringBuilder html = new StringBuilder();
		html.append("<html>")
			.append("<body>")
			.append("<h1>登录页面</h1>")
			.append("<form method=\"post\" action=\"/LoginServlet\">") // 引号需要使用 \ 转换。action="另一个Servlet的URI路径"
			.append("用户名:<input type=\"text\" name=\"username\"><br>")
			.append("密码:<input type=\"text\" name=\"password\"><br>")
			.append("<input type=\"checkBox\" name=\"avoidLogin\">三天免登录(选中按钮三天内免登陆)<br>") // 三天免登录按钮,选中按钮三天内免登陆
			.append("<input type=\"submit\" value=\"登录\">")
			.append("</form>")
			.append("</body>")
			.append("</html>");
		// 设置响应实体
		resp.getWriter().write(html.toString());
	}
}

LoginServlet类:处理点击登录按钮登录功能

在第一次登录成功后,会判断用户是否勾选三天免登录按钮。

如果勾选了,那么接下来会在浏览器写入一个Cookie(cookieUsername),并且设置时间为三天,访问登录页面时就直接到登录成功页面。

如果没有勾选,下一次还是需要登录。

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.changsheng.login.pojo.User;
import com.changsheng.login.service.IUserService;
import com.changsheng.login.service.impl.UserServiceImpl;

/**
 * 处理点击登录按钮登录功能
 * 
 * @author changsheng
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {

	IUserService us = new UserServiceImpl();

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 1.设置请求编码格式
		req.setCharacterEncoding("utf-8");
		// 2.设置响应编码格式
		resp.setHeader("content-type", "text/html;charset=utf-8");
		// 3.获取请求信息
		String username = req.getParameter("username"); // 获取用户名。如果是中文用户名,需要转换编码格式
		String password = req.getParameter("password"); // 获取密码
		String avoidLogin = req.getParameter("avoidLogin"); // 获取是否免登录
		System.out.println("输入的用户名为:"+username+" 密码:"+password+" 是否三天免登录:"+avoidLogin);
		// 4.处理请求信息
		User user = new User(); // 创建User对象,存放值
		user.setUsername(username); // 这边获取的信息在控制台打印时没有乱码,所以就不转换编码格式了。如果出现乱码需要转换编码!
		user.setPassword(password);
		List<User> list = us.selectUserList(user); // 查询该用户对象是否存在
		// 5.响应处理结果
		if (list == null || list.isEmpty()) { // 如果查询到的list为null或者为空,说明登录失败
			System.out.println("登录失败!\n"+user);
			// 重定向到登录页Servlet
			resp.sendRedirect(req.getContextPath() + "/LoginPageServlet");
		} else { // 登录成功
			if ("on".equals(avoidLogin)) { // 判断是否需要写入Cookie信息。如果用户点击了三天免登录按钮,则写入Cookie
				User u = list.get(0); // 获取登录的用户信息
				Cookie c = new Cookie("cookieUsername", u.getUsername()); // 将登录用户的用户名写入Cookie。(按道理应该是将id写入的,当初写User类的时候忘记了,所以这里就写用户名了)
				c.setMaxAge(60*60*24*3); // 最大时间为3天
				c.setPath("/"); // Cookie携带的路径为所有路径
				resp.addCookie(c); // 响应中加入Cookie信息
			}
			resp.getWriter().append("登录成功!");
		}
	}

}

二、演示

访问登录页面
在这里插入图片描述
输入正确的账号密码,且勾选三天免登录。
在这里插入图片描述
登录成功!
在这里插入图片描述
此时再去访问登录页面。因为我登录成功了,且勾选了三天免登录,所以此时应该时直接返回登录成功页面。且Cookie中应该也携带了我们设置的三天免登录信息。
在这里插入图片描述

至此三天免登录案例做完。

需要注意的是:如果你写代码的时候在测试,需要把浏览器的缓存清除一下。不然Cookie信息一直存在会影响测试!

源码链接

源码下载链接分享:https://pan.baidu.com/s/1CDFzTS5UbZORCt02YTVrlQ
提取码:h55u