上一片文章实现了用户验证  查看

当用户成功登录后,关闭浏览器,重新打开浏览器访问http://localhost:8080,页面会跳转到登录页,因为浏览器的关闭后之前的登录已失效

Shiro提供了Remember Me的功能,用户的登录状态不会因为浏览器的关闭而失效,直到Cookie过期

1.修改ShiroConfig

(1)添加

/*** cookie对象* @return*/public SimpleCookie rememberMeCookie() {// 设置cookie名称,对应login.html页面的<input type="checkbox" name="rememberMe"/>SimpleCookie cookie = new SimpleCookie("rememberMe");// 设置cookie的过期时间,单位为秒,这里为一天cookie.setMaxAge(86400);return cookie;}/*** cookie管理对象* @return*/public CookieRememberMeManager rememberMeManager() {CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();cookieRememberMeManager.setCookie(rememberMeCookie());// rememberMe cookie加密的密钥cookieRememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));return cookieRememberMeManager;}

(2)将cookie管理对象设置到SecurityManager

  修改securityManager()为

@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();securityManager.setRealm(myShiroRealm());securityManager.setRememberMeManager(rememberMeManager());//新加return securityManager;}

(3)改权限配置

  将ShiroFilterFactoryBean的

filterChainDefinitionMap.put("/**", "authc")

  修改为

filterChainDefinitionMap.put("/**", "user");

说明:

  user指的是用户认证通过或者配置了Remember Me记住用户登录状态后可访问

2.修改login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" th:href="@{/css/login.css}" type="text/css"><link rel="stylesheet" th:href="@{css/iCheck/minimal/blue.css}" type="text/css"><link rel="stylesheet" th:href="@{css/app.css}" type="text/css"><script th:src="@{/js/jquery.min.js}"></script>
</head>
<body>
<div class="login-page"><!-- Form--><div class="form"><div class="form-toggle"></div><div class="form-panel one"><div class="form-header"><h1>账户登录</h1></div><div class="form-content"><div class="form-group"><label>用户名</label><input type="text" name="account" /></div><div class="form-group"><label>密码</label><input type="password" name="password" /></div><div class="form-group" style="margin: 0px;"><p><input type="checkbox" name="rememberMe" />&nbsp;&nbsp;记住我</p></div><div class="form-group"><button onclick="login()" id="loginButton">登录</button></div></div></div></div></div>
</body>
<script th:inline="javascript">var ctx = [[@{/}]];function login() {var account = $("input[name='account']").val();var password = $("input[name='password']").val();var rememberMe = $("input[name='rememberMe']").is(':checked');$.ajax({type: "post",url: ctx + "login",data: {"account": account,"password": password,"rememberMe": rememberMe},dataType: "json",success: function (r) {if (r.code == 0) {location.href = ctx + 'index';} else {alert(r.msg);}}});}
</script>
</html>

View Code

3.修改LoginController

@PostMapping("/login")@ResponseBodypublic ResponseBo login(String account, String password, Boolean rememberMe) {System.out.println(rememberMe);// 密码MD5加密password = MD5Utils.encrypt(account, password);System.out.println(password);UsernamePasswordToken token = new UsernamePasswordToken(account, password);rememberMe = rememberMe == null ? false : rememberMe;   //null=>false
        token.setRememberMe(rememberMe);//UsernamePasswordToken token = new UsernamePasswordToken(username, password,rememberMe);// 获取Subject对象Subject subject = SecurityUtils.getSubject();try {subject.login(token);if (rememberMe)  System.out.println("rememberMe--------");return ResponseBo.ok();} catch (UnknownAccountException e) {return ResponseBo.error(e.getMessage());} catch (IncorrectCredentialsException e) {return ResponseBo.error(e.getMessage());} catch (LockedAccountException e) {return ResponseBo.error(e.getMessage());} catch (AuthenticationException e) {return ResponseBo.error("认证失败!");}}

View Code

rememberMe选中的时候,Shiro就会帮忙记住用户的登录状态

说明:

  如果遇到下面错误

2019-06-24 15:37:49.620 WARN 12952 --- [nio-8088-exec-2] o.a.shiro.mgt.DefaultSecurityManager : Delegate RememberMeManager instance of type [org.apache.shiro.web.mgt.CookieRememberMeManager] threw an exception during onSuccessfulLogin. RememberMe services will not be performed for account [com.sfn.bms.system.model.User@86fc436].

org.apache.shiro.io.SerializationException: Unable to serialize object [com.sfn.bms.system.model.User@86fc436]. In order for the DefaultSerializer to serialize this object, the [org.apache.shiro.subject.SimplePrincipalCollection] class must implement java.io.Serializable.

  解决方法查看

转载于:https://www.cnblogs.com/baby123/p/11074662.html

Spring boot后台搭建二集成Shiro添加Remember Me相关推荐

  1. 从服务器基础环境配置到搭建Docker+Gitlab+Gitlab Runner,完整介绍Spring Boot项目的持续集成与持续交付具体实现!

    1. 序言 在大学的课程学习,非常注重团队协作的培养,在企业开发中,团队协作开发项目的场景更是甚多.另外,在当下的热门技术栈中,微服务开发模式.前后端分离开发模式逐渐盛行,Spring Boot.VU ...

  2. Spring Boot(十二)集成spring-boot-starter-mail发送邮件

    项目GitHub地址 : https://github.com/FrameReserve/TrainingBoot Spring Boot(十二)集成spring-boot-starter-mail发 ...

  3. 【Spring Boot】使用Spring Boot来搭建Java web项目以及开发过程

    [Spring Boot]使用Spring Boot来搭建Java web项目以及开发过程 一.Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来 ...

  4. Spring Boot 模板引擎FreeMarker集成

    Spring Boot 模板引擎FreeMarker集成 一.FreeMaker介绍 FreeMarker是一款免费的Java模板引擎,是一种基于模板和数据生成文本(HMLT.电子邮件.配置文件.源代 ...

  5. Spring Boot Admin在线查看spring boot后台日志

    当前,应用系统微服务架构.前后端分离(前端vue,后端springboot),已经成为大部分项目的标准技术架构,但在项目上线后,spring boot后端服务部署在服务器上,大部分公司对服务器都有安全 ...

  6. Spring Boot框架搭建

    目录 一.Spring Boot概述 二.Spring Boot的优点 三.Spring Boot框架搭建 一.Spring Boot概述 Spring Boot 是 Spring 框架的一个新的子项 ...

  7. Spring Boot 内置Tomcat——集成PHP解决方案

    Demo:https://gitee.com/shentuzhigang/mini-project/tree/master/springboot-embed-tomcat-php-demo 问题分析 ...

  8. Spring Boot:(二)启动原理解析

    Spring Boot:(二)启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏. ...

  9. Spring Boot 1.5.8集成Swagger2 + YApi —— Swagger常用注解说明

    前言 受新型冠状病毒的影响,在家像猪一样不是睡就是吃,闲着就学着用下Swagger和YApi,特将这几天的学习成果写成了这系列的文章,希望能对大家有所帮助.武汉加油,中国加油! Spring Boot ...

最新文章

  1. mysql 5.7 收费_MySQL5.7 常用用户操作
  2. NLP研究方向的「情感分析领域」的简单调研
  3. python能开发什么产品_三周学 Python ?不,三周做个产品
  4. 转:SQL SERVER中一些常见性能问题的总结
  5. Vue.js - Day2
  6. idea中java文件红色处理
  7. Python Cheat Sheet 中文版
  8. 广州橙优设计:学习UI需要那些?UI设计必须会的软件
  9. Docker引擎客户端工具docker的总结
  10. MDK5软件入门之——基础工程创建及下载和调试
  11. C#_根据银行卡卡号判断银行名称
  12. Android之APP跳转到权限设置界面适配华为、小米、vivo等
  13. 西班牙首相被中国新零售圈粉!天猫总裁靖捷透露了一个“合伙人计划”
  14. Windows下通过注册表修改某个类型文件的默认打开方式和文件图标
  15. 2018 ICPC 焦作区域赛 Resistors in Parallel(找规律+大数)
  16. mosquitto使用的基本流程以及一些遇见的问题
  17. 基于Java的XML编辑器:Oxygen XML Editor Mac中文版
  18. 想要出国读博作博后的看过来:德国马普育种所植物与微生物互作方向招收3名博士1名博后
  19. 丁苯嵌段共聚物的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. 简简单单做一个带过期时间的内存缓存

热门文章

  1. 计生委称老龄化是社会进步表现 暂不放开二胎--如此之文章一定要转载,等待鞭尸...
  2. 如何用微博推广淘宝店铺
  3. 基于 Nios II 的串口打印和流水灯设计【使用 Quartus 软件】【掌握 SOPC 开发流程】
  4. 超简单的页面(图片、文字、布局。。。)等比缩放
  5. Kafka+Scram认证+eagle管理
  6. Apache Kafka API AdminClient Scram账户的创建与删除
  7. foxmail发生RCPT错误
  8. 彻底解决Eclipse自动补全变量名问题的方法步骤
  9. 在window上提交spark代码到远程测试环境上运行
  10. 并发编程之CPU缓存架构缓存一致性协议详解(二)