JavaWeb 自动登录和退出(图解代码执行流程)

本贴最后更新于 1917 天前,其中的信息可能已经东海扬尘

自动登录

主要通过 cookie 和 session 的使用,实现自动登录

转载请标明出处:
https://www.zousiliang.com/articles/2019/04/02/1554207522314.html
本文出自塞伯克

第一次登录执行流程

用户第一次登录的时候,只要勾选自动登录功能,我们就生成一个 cookie,并将用户名和密码保存到 cookie 中存放到用户的浏览器中

image

生成 cookie 的代码:
// 判断用户是不是想自动登录
String auto = request.getParameter("auto");
if ("ok".equalsIgnoreCase(auto)) {
    // 说明用户想自动登录
    Cookie cookie = new Cookie("autoLogin", userFind.getUsername() + "&" + userFind.getPassword());
    // 设置cookie的存活时间和绑定路径
    cookie.setMaxAge(360000);
    cookie.setPath(request.getContextPath());
    // 在响应中添加cookie,并返回给浏览器
    response.addCookie(cookie);
}

第二次登录执行流程

有了用户的 cookie 后,我们就可以到 cookie 中读取用户的账号和密码,进行自动登录,然后登录成功后将用户名和密码放到 session 中,否则每次用户点击我们的页面中的链接时,我们都需要到数据库查询判断,影响效率

image

AutoLoginFilter 代码
import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class AuthorityInterceptor implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

   
    /**
     * 处理过滤信息方法
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        Object object = req.getSession().getAttribute("user");
        // 如果从session中获取user为空,我们才需要获取cookie进行登陆以及存放到session中,否则直接放行
        if (object == null) {
            // 获取请求携带的cookies
            Cookie[] cookies = req.getCookies();
            Cookie cookie = null;
            // 先要判断获取的cookies是否存在,不然遍历的时候会报空指针异常
            if (cookies != null && cookies.length > 0) {
                // 遍历cookies
                for (Cookie c : cookies) {
                    String name = c.getName();
                    if ("autoLogin".equals(name)) {
                        // 说明cookie中存在自动登录信息
                        cookie = c;
                        break;
                    }
                }
            }

            try {
                // 说明存在自动登陆的cookie
                if (cookie != null) {
                    // 我们需要把cookie的值读取出来存放到session中
                    String[] split = cookie.getValue().split("&");
                    User user = new User();
                    user.setUsername(split[0]);
                    user.setPassword(split[1]);
                    // 调用service层登陆
                    UserService service = new UserServiceImpl();
                    User userBack = service.login(user);
                    if (userBack != null) {// 说明登陆成功
                        req.getSession().setAttribute("user", userBack);
                    }
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        // 如果不存在直接 放行
        chain.doFilter(req, resp);

        // 过滤响应
    }
    @Override
    public void destroy() {
    }

}

退出登录

退出的主要思路就是把 session 中和 cookie 中用户信息干掉

public void loginOut(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 干掉cookie和session
        HttpSession session = request.getSession();
        session.removeAttribute("user");

        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie c : cookies) {
                if ("autoLogin".equals(c.getName())) {
                    //设置cookie存活时间为0
                    c.setMaxAge(0);
                    //将cookie响应到前台
                    response.addCookie(c);
                    break;
                }
            }
        }
        // 重定向到首页
        response.sendRedirect(request.getContextPath() + "/login.jsp");
    }
  • 登录
    17 引用 • 133 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...