Servlet中通過攔截器實現用戶自動登錄


  智商不夠,努力來湊,第一次寫博客,總結下這幾天學習的用戶記住用戶名和自動登錄的知識。

  自動登錄是基於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>
login.jsp
 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     }
LoginServlet.java
 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     }
AutoLoginFilter.java
 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>
web.xml


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM