智商不夠,努力來湊,第一次寫博客,總結下這幾天學習的用戶記住用戶名和自動登錄的知識。
自動登錄是基於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>