使用Cookie模拟自动登录

用户登录一次后选择自动登录,在下次登录该网站时无需登录步骤,就可直接进入网页。

首先应该有一个过滤器判断用户是否设置了自动登录,如果设置了自动登录则从Cookie中读取数据直接登录,进入网站。创建过滤器,并注册到应用中:

public class LoginFilter implements Filter {
	public void init(FilterConfig fConfig) throws ServletException {}
	public void destroy() {}
	public void doFilter(ServletRequest reqest, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) reqest;
		HttpServletResponse res = (HttpServletResponse) response;
		if (!req.getRequestURI().endsWith("login.html")&&!req.getRequestURI().endsWith("loginServlet")) {
			HttpSession session = req.getSession();
			User sessionUser = (User) session.getAttribute("user");
			if (sessionUser == null) {
				Cookie[] cookies = req.getCookies();
				if (cookies != null) {
					for (int i = 0; i < cookies.length; i++) {
						if (cookies[i].getName().equals("login")) {
							String loginInfo = cookies[i].getValue();
							String[] infos = loginInfo.split("&", 2);
							String username = infos[0];
							String password = infos[1];
							User user = new User(username, password);
							session.setAttribute("user", user);
							chain.doFilter(req, res);
							return;
						}
					}
				}
				res.sendRedirect("login.html");
				return;
			}
		}
		chain.doFilter(reqest, response);
	}
}

在该过滤器中先从session中取user值,如果没有则判断该客户端是否有名为login的Cookie,如果有表示该用户设置了自动登录,且已经保存了登录信息(即已经登录过)则直接跳转到目标页面,如果以上条件都没有满足,则跳转至登录页面。web.xml文件中Filter的配置代码为:

<filter>
  	<filter-name>LoginFilter</filter-name>
  	<display-name>LoginFilter</display-name>
  	<filter-class>filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>LoginFilter</filter-name>
  	<url-pattern>*</url-pattern>
  </filter-mapping>

然后创建登录页面:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
	<form name = "loginForm" method="POST" action="loginServlet">
		<table>
			<tr>
				<td><div align="right">用户名:</div></td>
				<td><input type="text" name="username"></td>
			</tr>
			<tr>
				<td><div align="right">密码:</div></td>
				<td><input type="password" name="password"></td>
			</tr>
			<tr>
				<td><input type="checkbox" name="autoLogin">自动登录</td>
			</tr>
			<tr>
				<td><input type="submit" name="submit" value="登录"></td>
				<td><input type="reset" name="reset" value="重置"></td>
			</tr>
		</table>
	</form>
</body>
</html>

该登录页面请求Servlet,在Servlet中进行数据的校验等工作:

public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}
 
	protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		boolean auto = req.getParameter("autoLogin")!=null&&req.getParameter("autoLogin").equals("on")?true:false;
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		User user = new User(username , password);
		HttpSession session = req.getSession();
		session.setAttribute("user", user);
		Cookie cookie = null;
		Cookie[] cookies = req.getCookies();
		if(cookies !=null){
			for(int i = 0 ; i < cookies.length ; i++){
				if(cookies[i].getName().equals("login")){
					cookie = cookies[i];
					cookie.setValue(username + "&" + password);
				}
			}
		}
		if(cookie == null){
			cookie = new Cookie("login" , username + "&" + password);
		}
		if(auto){
			cookie.setMaxAge(60*60*24*7);
		}else{
			cookie.setMaxAge(0);
		}
		res.addCookie(cookie);
		res.sendRedirect("hello.jsp");
	}
}

在该Servlet中完成的工作是将用户信息保存至session并根据逻辑判断操作Cookie。登录成功后页面跳转至欢迎页面hello.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" import="helloworld.bean.User"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>hello</title>
<%User user = (User)session.getAttribute("user"); %>
</head>
<body>
	<b>你好:<%=user.getUsername() %></b>
</body>
</html>

在保存用户信息时使用到一个简单的JavaBean:User。

以上就是该实验中用到的页面。按照以下步骤进行访问:

(1) 启动项目后,打开浏览器访问项目中的任意页面。如:http://localhost:8080/webdemo/hello.jsp,发现会被拦截到登录页面,输入登录信息,此时不勾选自动登录,点击登录,页面跳转至hello.jsp。

(2) 关闭浏览器再打开并访问http://localhost:8080/webdemo/hello.jsp,被拦截到登录页面。此时填写登录信息后勾选自动登录,登录成功后关闭浏览器。

(3) 打开同一浏览器,继续访问http://localhost:8080/webdemo/hello.jsp,此时发现没有被拦截,原因是上一步中向客户端写了一个Cookie,打开浏览器并访问时,程序读取到用户信息直接放入session,完成了自动登录的功能。

访问http://localhost:8080/webdemo/login.html.。此时不勾选自动登录,登录成功后,重复步骤一、二,自动登陆功能已经取消。


作者:Goskalrie
来源:CSDN
原文:https://blog.csdn.net/goskalrie/article/details/51202741

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值