智商不够,努力来凑,第一次写博客,总结下这几天学习的用户记住用户名和自动登录的知识。
自动登录是基于servlet中的过滤器实现的,主要的流程就是用户在前端输入请求之后,servlet的拦截器会拦截所有的请求(看设置,这里设置的是/* 即为拦截所有的请求),当拦截器拦截拦截到请求的过程中,进行校验,如果用户勾选了自动登录按钮,则浏览器的cookie中查找放入cookie的用户信息,获取到cookie信息后调用登录方法,进行登录。
流程

1 <form method="post" action="${pageContext.request.contextPath }/login"> 2 <table> 3 <tr> 4 <td>用户名</td> 5 <td><input type="text" name="username" ></td> 6 </tr> 7 <tr> 8 <td>密码</td> 9 <td><input type="text" name="password"></td> 10 </tr> 11 <tr> 12 <td colspan="1"><input type="checkbox" name="saveName" value="ok">记住用户名</td> 13 <td colspan="1"><input type="checkbox" name="autoLogin" value="ok">自动登录</td> 14 </tr> 15 <tr> 16 <td colspan="2"><input type="submit"></td> 17 </tr> 18 19 </table> 20 </form>

1 public class LoginServlet extends HttpServlet { 2 private static final long serialVersionUID = 1L; 3 4 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 5 //0.设置编码 6 request.setCharacterEncoding("utf-8"); 7 8 //1.获取用户名和密码 9 String username=request.getParameter("username"); 10 String password=request.getParameter("password"); 11 12 //2.调用service' 13 User user=null; 14 try { 15 user = new UserService().login(username,password); 16 } catch (SQLException e) { 17 // TODO Auto-generated catch block 18 e.printStackTrace(); 19 } 20 21 //3.判断user是否为空 22 if(user==null){ 23 request.setAttribute("msg", "用户名和密码不匹配"); 24 request.getRequestDispatcher("/login.jsp").forward(request, response); 25 return; 26 }else{ 27 //若不为空 跳转到success.jsp 28 request.getSession().setAttribute("user", user); 29 30 //判断是否勾选了自动登录 若勾选了需要将用户名和密码放入cookie中, 写回浏览器 31 if(Constant.IS_AUTO_LOGIN.equals(request.getParameter("autoLogin"))){ 32 //创建cookie 注意中文 33 Cookie c=new Cookie("autologin", username+"-"+password); 34 c.setMaxAge(3600); 35 c.setPath(request.getContextPath()+"/"); 36 37 response.addCookie(c); 38 } 39 40 //判断是否勾选了记住用户名 若勾选了需要将用户名放入cookie中 写回浏览器 41 if(Constant.IS_SAVE_NAME.equals(request.getParameter("saveName"))){ 42 //创建cookie 43 Cookie c=new Cookie("savename", URLEncoder.encode(username, "utf-8")); 44 c.setMaxAge(3600); 45 c.setPath(request.getContextPath()+"/"); 46 47 response.addCookie(c); 48 } 49 50 //页面重定向 51 response.sendRedirect(request.getContextPath()+"/success.jsp"); 52 } 53 54 } 55 56 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 57 doGet(request, response); 58 }

1 public class AutoLoginFilter implements Filter{ 2 3 @Override 4 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 5 throws IOException, ServletException { 6 //1.强转 7 HttpServletRequest request =(HttpServletRequest) req; 8 HttpServletResponse response =(HttpServletResponse) resp; 9 10 //2.完成自动登录 11 //2.1 判断session中有无登录登录用户 没有的话继续自动登录 12 User user=(User) request.getSession().getAttribute("user"); 13 if(user==null){ 14 //没有用户 需要自动登录 15 //2.2 判断访问的资源是否和登录注册相关,若相关则不需要自动登录 16 String path = request.getRequestURI();// /day1601/xxx 17 if(!path.contains("/login")){ 18 19 //2.3获取指定的cookie 20 Cookie c = CookUtils.getCookieByName("autologin", request.getCookies()); 21 //判断cookie是否为空 22 //若不为空 获取值(username和passowrd) 调用serivce完成登录 判断user是否为空 不为空 放入session 23 if(c!=null){ 24 String username=c.getValue().split("-")[0]; 25 String password=c.getValue().split("-")[1]; 26 27 //调用serivce完成登录 28 //user=null; 29 try { 30 user = new UserService().login(username, password); 31 } catch (SQLException e) { 32 // TODO Auto-generated catch block 33 e.printStackTrace(); 34 } 35 36 if(user!=null){ 37 //将user放入session中 38 request.getSession().setAttribute("user", user); 39 } 40 } 41 } 42 43 } 44 45 46 47 //3.放行 48 chain.doFilter(request, response); 49 }

1 <filter> 2 <filter-name>AutoLoginFilter</filter-name> 3 <filter-class>com.itheima.web.filter.AutoLoginFilter</filter-class> 4 </filter> 5 <filter-mapping> 6 <filter-name>AutoLoginFilter</filter-name> 7 <url-pattern>/*</url-pattern> 8 </filter-mapping> 9 10 <servlet> 11 <description></description> 12 <display-name>LoginServlet</display-name> 13 <servlet-name>LoginServlet</servlet-name> 14 <servlet-class>com.itheima.web.servlet.LoginServlet</servlet-class> 15 </servlet> 16 <servlet-mapping> 17 <servlet-name>LoginServlet</servlet-name> 18 <url-pattern>/login</url-pattern> 19 </servlet-mapping>