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