使用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