美文网首页
Filter实现用户自动登录功能小结

Filter实现用户自动登录功能小结

作者: secondtown | 来源:发表于2018-09-06 16:31 被阅读50次
    目的:

    对“Filter实现用户自动登录”这个应用案例的背后逻辑进行一些梳理。
      实现用户自动登录具体是什么意思呢,我们知道,当我们在登录页面通过POST方式发送请求时,我们的request对象会带上表单信息(这里以username和password为例),以及我们的cookies。首次访问服务器时cookies信息里面没有保存username和password。我们必须通过form表单的信息来登录。
      但是如果我们不是通过登录页面来访问,由于没有了form表单提供的信息,我们的request只携带了cookies,我们也只能够通过request里面的信息来保证我们成功登录。也由于不需要手动在表单里面进行输入,所以我们可以理解为自动登录。所以说,所谓的自动登录就是“在访问服务器时,服务器读取cookies里面的登录信息”。
      那我们应用的任何一次请求或者跳转都需要服务器对cookies进行读取.而下面的AutoLoginFilter则是将所有的请求(注意是所有,所以在web.xml中其filter-mapping的值为"/*")进行拦截,所以AutoLoginFilter根本不会管request有没有带有表单信息,它只关心cookies。如果cookies中有autologin变量并且存储在autologin变量里面的用户信息匹配的话,那么就新建一个user对象保存到session中(可以不保存吗?),然后放行。
    而我们的LoginServlet要做的事情可不止这一些。我们要知道LoginServlet主要面对的是从登陆页面login.jsp过来的请求。而AutoLoginFilter则是更多用于处理应用里面的各种各样的跳转请求。从login.jsp过来的request请求的其中一个不同的地方在于它是带有表单信息的。所以我们的LoginServlet见到request并不是急不可耐就要去找cookies信息,而是先从request中获取用户提交的表单信息。如果这里的信息匹配的话,那么就像上面的AutoLoginFilter一样,可以常见user对象并且保存到session域中。登录成功以后,服务器还需要将session发送回去给浏览器。


    背景:

      之前接触过通过cookie或者session来实现用户自动登录功能。其原理是,当客户端首次访问服务器时,服务器会向客户端发送cookie,cookie里面记录有用户的信息。当客户端再次访问服务器时,会带上这些cookie信息,而服务器获取这些cookie信息后就能够判断是同个客户端,验证信息后就能让其自动登录。如果和request里面的值匹配就允许登录。

      我们首先需要一个login.jsp页面。由于在这个案例中不涉及数据库的知识。因此案例的登录逻辑比较简单,即在servlet中指定特定的username和password的值。
    在login.jsp页面中设置按钮:

    <input type="submit" value="登录" />
     <input type="submit" value="无用"/>//这里只是起说明用
    <input type="reset" value="重置" />
    

      这里关键在于type,一旦按下“登录”键,由于其类型type是“submit”,因此就会触发表单form的动作。所以即便我点击的不是“登录”,而是“无用”按钮,同样会触发表单form的动作。当然,前提是input标签放在对应的form标签里面。

    <form action="${pageContext.request.contextPath }/LoginServlet"  method="post">
    

      假如原来的URL请求是:localhost:8080/chapter04/login.jsp
    那么表单就会跳转到 localhost:8080/chapter04/LoginServlet
    (由于LoginServlet已经注册在web.xml中,所以就可以跳转到对应的LoginServlet这个Servlet中)。

    但是现在设置了AutoLoginFilter这个过滤器,其doFilter方法关键代码为:

        HttpServletRequest request = (HttpServletRequest) req;
        // 获得一个名为 autologin 的cookie
        Cookie[] cookies = request.getCookies();
        String autologin = null;
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if ("autologin".equals(cookies[i].getName())) {
                // 找到了指定的cookie
                autologin = cookies[i].getValue();
                break;
            }
        }
      ***上面代码先判断request中的cookie有没有autologin这个变量存在。如果有将其取出并进入到下面的判断,如果没有则默认autologin为空,进入到下面的判断。
    
        if (autologin != null) {
            // 做自动登录
            String[] parts = autologin.split("-");
            String username = parts[0];
            String password = parts[1];
            // 检查用户名和密码
            if ("***".equals(username)&& ("***").equals(password)) {
                // 登录成功,将用户状态 user 对象存入 session域
                User user = new User();
                user.setUsername(username);
                user.setPassword(password);
                request.getSession().setAttribute("user", user);
            }
        }
        // 放行
        chain.doFilter(request, response);
        ***如果autologin不为空,先将username和password读取出来。
        如果能匹配,那么新建user对象,并将该对象保存到session中。然后放行。如果autologin为空或者里面的用户信息不能匹配,那么就不创建对象直接放行。
    

        ***放行后进入到LoginServlet,这时候采取的是直接从request的表单中读取username和password的方法。
    
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        // 检查用户名和密码,**部分表示设置的用户名和密码
        if ("***".equals(username) && "***".equals(password)) {
            // 登录成功
            // 将用户状态 user 对象存入 session域
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            request.getSession().setAttribute("user", user);
            // 发送自动登录的cookie
    
        ***同样先从request中获取autologin变量。如果autologin不为空。
          那么就新建一个名为autologin的cookie,里面保存了username和password。
    
            String autoLogin = request.getParameter("autologin");
            if (autoLogin != null) {
                // 注意 cookie 中的密码要加密
                Cookie cookie = new Cookie("autologin", username + "-"
                        + password);
                cookie.setMaxAge(Integer.parseInt(autoLogin));
                cookie.setPath(request.getContextPath());
                response.addCookie(cookie);
            }
    
         *** 这时候由于上面验证过了用户信息,所以最后能够成功跳转到index.jsp。
        否则如果验证不通过,继续跳转回到login.jsp。
            // 跳转至首页
                response.sendRedirect(request.getContextPath()+
                    "/index.jsp");
        } else {
            request.setAttribute("errerMsg", "用户名或密码错");
            request.getRequestDispatcher("/login.jsp").forward(request,
                    response);
        }
    

    相关文章

      网友评论

          本文标题:Filter实现用户自动登录功能小结

          本文链接:https://www.haomeiwen.com/subject/ntyxgftx.html