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

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

自动登录

主要通过 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3198 引用 • 8215 回帖

相关帖子

欢迎来到这里!

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

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