Springboot实现remember

您所在的位置:网站首页 前端记住密码 Springboot实现remember

Springboot实现remember

2024-07-10 06:25| 来源: 网络整理| 查看: 265

1.什么是remeber-me?

remeber-me即记住我功能,是我们在登录web系统时的常见勾选项。当我们登录一个web系统时除了输入常规的用户名、密码后还可以勾选记住我选项(假设该系统提供了该选项),此时假设用户名、密码输入正确那么系统将会在客户浏览器cookie中记录用户登录相关认证相关信息。实现的效果就是当我们下次再次访问该网站某些页面时无需再次登录。

在这里插入图片描述

2.rember-me实现原理 2.1 登录过程中记住我流程:

在这里插入图片描述

2.2 直接访问系统目标页,服务端验证流程:

在这里插入图片描述

2.3 退出流程

删除cookie,销毁session。

3.使用springboot实现步骤

本文为了快速演示记住我功能将采取服务端硬编码方式代替数据库存储,表达的原理一致就Ok。

只列出关键部分代码,详细请看文章结尾源码链接查看完整代码。

3.1 创建用户模型 @Data public class SysUser { private String username; private String password; private Integer rememberMe; } 3.2 创建登录控制器 @Controller @Slf4j public class LoginController { @RequestMapping("/login") public String loginPage(){ return "login"; } @RequestMapping("/index") public String index(){ return "index"; } @PostMapping("/dologin") public String login(SysUser user, HttpServletRequest request, HttpServletResponse response, Model model){ // 判断用户名密码 if(!("admin".equals(user.getUsername()) && "admin".equals(user.getPassword()))){ return "redirect:login"; } // 认证成功,向session中添加用户信息 HttpSession session = request.getSession(); session.setAttribute("user",user); // 判断是否勾选了记住我 if(user.getRememberMe()!=null){ // 为了演示方便token写死,为用户名:admin的base64编码 Cookie cookie = new Cookie("boot_rememberMe", "YWRtaW4="); // 为了演示设置cookie过期时间为30s cookie.setMaxAge(30); response.addCookie(cookie); } return "redirect:index"; } @GetMapping("/logout") public String logout(HttpServletRequest request, HttpServletResponse response){ HttpSession session = request.getSession(); if (null == session || session.getAttribute("user") == null) { return "login"; } session.invalidate(); Cookie[] cookies = request.getCookies(); if (ObjectUtils.isEmpty(cookies)) { } else { for (Cookie cookie : cookies) { String name = cookie.getName(); if (name.equals("boot_rememberMe")) { cookie.setMaxAge(0); response.addCookie(cookie); } } } return "login"; } } 3.3 创建RememberFilter @Slf4j @Component public class RememberFilter implements Filter { private String[] noFilterArray=new String[]{"/login","/dologin"}; @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { List noFilterList= Arrays.asList(noFilterArray); HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String requestURI = req.getRequestURI(); requestURI = requestURI.substring(requestURI.lastIndexOf("/")); // 判断是否为不需要过滤请求 if (noFilterList.contains(requestURI)) { filterChain.doFilter(request,response); }else{ HttpSession session = req.getSession(); if (null==session||session.getAttribute("user")==null) { Cookie[] cookies = req.getCookies(); if (ObjectUtils.isEmpty(cookies)) { ((HttpServletResponse) response).sendRedirect(req.getContextPath()+"/login"); return; } else { SysUser user = null; for(Cookie cookie:cookies){ String name = cookie.getName(); if (name.equals("boot_rememberMe")) { String value = cookie.getValue(); // 演示采用硬编码,实际需要和数据库中token比较 if (!value.equals("YWRtaW4=")) { Cookie cookie1=new Cookie("boot_rememberMe",null); cookie1.setMaxAge(0); res.addCookie(cookie1); }else{ user = new SysUser(); user.setUsername("admin"); user.setPassword("admin"); user.setRememberMe(1); session.setAttribute("user", user); log.info("从cookie中获取user放入session"); } } } if(user==null){ ((HttpServletResponse) response).sendRedirect(req.getContextPath()+"/login"); return; } } } filterChain.doFilter(request,response); } } } 3.4 创建登录页 后台管理系统 用户名: 密码: 记住我 登录 3.5 创建首页 欢迎, 退出 4.测试

输入地址:localhost:9000/login,用户名:admin,密码:admin

4.1 不勾选记住我

不勾选就是简单的登录退出功能。

4.2 勾选记住我 成功登陆后,关闭浏览器30s内再次打开浏览器输入首页地址发现可以直接访问30s后再次访问首页发现cookie失效直接跳转到登录页退出后cookie失效,无法再次访问首页 4.3 相关截图

在这里插入图片描述 在这里插入图片描述

首页 在这里插入图片描述 5.项目代码

https://gitee.com/indexman/boot_rememberme/tree/master/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3