【SpringSecurity】十二、集成JWT搭配Redis实现退出登录
文章目录
- 1、登出的实现思路
- 2、集成Redis
- 3、认证成功处理器
- 4、退出成功处理器
- 5、修改token校验过滤器
- 6、调试
1、登出的实现思路
这是目前的token实现图:


因为JWT的无状态,服务端无法在使用过程中主动废止某个 token,或者更改 token 的权限。也就是说,目前,一旦 JWT 签发了,就只能等它到过期时间才能作废,即使用户已经退出登录。想实现登出,可以引入Redis:

此时,关于token的校验逻辑就变成了:

总结就是:
① 登陆成功之后把生成JWT存到redis中(同时设置key的TTL和JWT自身过期时间一样)
② 用户退出时,从redis中删除该token
③ 用户每次访问时,先校验jwt是否合法,如果合法再从redis里面取出logintoken:jwt判断这个jwt还存不存在,如果不存在就说是用户已经退出登录了
2、集成Redis
引入redis的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置连接信息:
spring:redis:host: localhostport: 6379database: 0password: 666666
注入redis操作对象的依赖:
@Resource
private StringRedisTemplate stringRedisTemplate;
(PS:我们没有创建RedisTemplate对象对应的bean,但这个bean却在我们引入依赖后自动加入到了Spring容器中,即自动装配。)
3、认证成功处理器
修改前一节的认证成功处理器,在向客户端发放token的同时存入redis,key的过期时间和token自身过期时间一致。
...@Resource
private StringRedisTemplate stringRedisTemplate;
....
stringRedisTemplate.opsForValue().set("logintoken:"+token,objectMapper.writeValueAsString(authentication),30, TimeUnit.MINUTES);
我这里key设置成了字符串logintoken:后跟token值,value则直接序列化认证对象authentication。

注意过期时间和jwt的过期时间保持一致,jwt过期时间可查看下创建jwt时的withExpiresAt方法。
4、退出成功处理器
添加退出成功处理器,退出后清除redis里存的token:
/*** 退出成功处理器,用户退出成功后,执行此处理器*/
@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {//使用此工具类的对象进行序列化操作@Resourceprivate ObjectMapper objectMapper;@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {//从请求头中获取Authorization信息String authorization = request.getHeader("Authorization");//如果授权信息为空,返回前端if(null==authorization){response.setCharacterEncoding("UTF-8");response.setContentType("application/json;charset=utf-8");HttpResult httpResult=HttpResult.builder().code(-1).msg("token不能为空").build();PrintWriter writer = response.getWriter();writer.write(objectMapper.writeValueAsString(httpResult));writer.flush();return;}//如果Authorization信息不为空,去掉头部的Bearer字符串String token = authorization.replace("Bearer ", "");//redis中删除token,这是关键点stringRedisTemplate.delete("logintoken:"+token);response.setCharacterEncoding("UTF-8");response.setContentType("application/json;charset=utf-8");HttpResult httpResult=HttpResult.builder().code(200).msg("退出成功").build();PrintWriter writer = response.getWriter();writer.write(objectMapper.writeValueAsString(httpResult));writer.flush();}
}
在安全配置类中配置用户成功退出处理器:
@Resource
private MyLogoutSuccessHandler myLogoutSuccessHandler;....
http.logout().logoutSuccessHandler(myLogoutSuccessHandler);
http.csrf().disable(); //禁用跨域请求保护 要不然logout不能访问
5、修改token校验过滤器
修改上一节的token校验器JWTCheckFilter,不再只校验token的合法性,合法时,还要校验服务端redis中是否有相应数据,以判断是否已经登出。
@Resource
private StringRedisTemplate stringRedisTemplate;//从redis中获取token
String tokenInRedis = stringRedisTemplate.opsForValue().get("logintoken:" + jwtToken);
if(!StringUtils.hasText(tokenInRedis)){printFront(response, "用户已退出,请重新登录");return;
}
完整:

6、调试
登录下先:

得到token:

此时,服务端redis:

登出时,token为空:

登出时,token错误:

正常登出:

此时,拿登出的token再请求接口:

相关文章:
【SpringSecurity】十二、集成JWT搭配Redis实现退出登录
文章目录 1、登出的实现思路2、集成Redis3、认证成功处理器4、退出成功处理器5、修改token校验过滤器6、调试 1、登出的实现思路 这是目前的token实现图: 因为JWT的无状态,服务端无法在使用过程中主动废止某个 token,或者更改 token 的权限…...
Docker进入容器出现bash: vi: command not found
🎈1 参考文档 docker基础容器中bash: vi: command not found问题解决 | 你邻座的怪同学-CSDN 🔍2 问题描述 在使用 Docker 容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found。 这个时候就需要…...
Linux_6_文件查找与打包压缩
目录 文件查找与打包压缩1文件查找1.1 locate1.2 find1.2.1 指定搜索目录层级1.2.2对每个目录先处理目录内的文件,再处理目录本身1.2.3根据文件名和inode查找1.2.4 根据属主、属组查找1.2.5根据文件类型查找1.2.6空文件或目录1.2.7组合条件1.2.8 排除日录1.2.9根据文…...
JavaWeb_LeadNews_Day9-Redis实现用户行为
JavaWeb_LeadNews_Day9-Redis实现用户行为 网关配置点赞阅读不喜欢关注收藏文章详情-行为数据回显来源Gitee 网关配置 nacos: leadnews-app-gateway # 用户行为微服务 - id: leadnews-behavioruri: lb://leadnews-behaviorpredicates:- Path/behavior/**filters:- StripPrefi…...
IntelliJ IDEA2021.3.1 使用 MybatisCodeHelperPro插件
一、 下载 下载破解后的 MybatisCodeHelperPro 的 V3.2.2版本 V3.2.2-CSDN 或者 V3.2.2-Gitee 二、 应用 将下载下来的Zip文件 放到电脑上的某个位置 (最好放在Idea 管理插件的 plugins 下) 然后自从搜索 Idea如何从磁盘中应用插件 三、激活 由于已经破解过了 但是还是需要激活…...
el-date-picker 等 点击无反应不回显问题解决
如上图,编辑回显正常,但是时间控件在拖动过程中时间不会跟随改变。 解决办法: <el-date-picker input"onInput()" ...><el-input input"onInput()" ...>js中onInput() {this.$forceUpdate();},...
Ansible学习笔记12
playbook: playbook(剧本):是ansible用于配置、部署和管理被控节点的剧本,用于Ansible操作的编排。 使用的是yaml格式,(saltstack、elk、docker、docker-compose、k8s都会使用到yaml格式。&am…...
sqlmap中文文档
这是 sqlmap -hh的翻译,后续可能会对参数进行详细的示例 sqlmap 普通选项 -h, --help # 显示基本帮助信息并退出 -hh # 详细帮助信息 --versino # 版本 -v # 日志详细级别 0-60:只显示python错误以及严重的信息。1:同时显示基本信…...
【C++模拟实现】vector的模拟实现
【C模拟实现】vector的模拟实现 目录 【C模拟实现】vector的模拟实现vector模拟实现的标准代码vector模拟实现中的要点insert和erase会涉及到迭代器失效的问题vector深度剖析关于模版template< class InputIterator >使用memcpy拷贝问题 作者:爱写代码的刚子 …...
go学习part21(3)redis连接池
连接池 1.介绍 每次使用数据就就建立链接再关闭可以,但是如果有大量客户端频繁请求连接,大量创建连接和关闭会非常耗费资源。 所以就建立一个连接池,里面存放几个不关闭的连接,谁要用就分配给谁。 说明:通过Golang 对 Redis操…...
乐理-笔记
乐理笔记整理 1、前言2、认识钢琴键盘及音名3、升降号、还原号4、如何区分同一音名的不同键?5、各类音符时值的关系6、歌曲拍号7、拍号的强弱规律8、歌曲速度(BPM)9、附点音符10、三连音12、唱名与简谱数字13、自然大调(白键&…...
java八股文面试[数据库]——B树和B+树的区别
B树是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(logn)的时间复杂度进行查找、顺序读取、插入和删除等操作。 1、B树的特性 B树中允许一个结点中包含多个key,可以是3个、4个、5个甚至更多,并不确定,需要看具体的实…...
2、Nginx 安装
文章目录 2、Nginx 安装2.1 官网下载2.2 安装 nginx2.2.1 第一步2.2.2 第二步2.2.3 第三步,安装 nginx2.2.4 第四步,修改防火漆规则 【尚硅谷】尚硅谷Nginx教程由浅入深 志不强者智不达;言不信者行不果。 2、Nginx 安装 2.1 官网下载 nginx…...
最适合 AI 的 Python Web 框架
迷途小书童的 Note 读完需要 4分钟 速读仅需 2 分钟 1 简介 本文将介绍 Gradio 库,它是 Python 的一个 web 框架,可以帮助我们快速构建交互式 AI 应用。我们将了解 Gradio 的应用场景、基本原理、功能介绍,并通过一个代码示例来演示如何使用 …...
算法通关村第十八关——回溯
回溯很大感觉就是多重递归,在递归的题目中,例如斐波那契数列,只需要考虑当前情况以及他的子情况。而在回溯中,要进行很多次递归,并且要对条件进行处理。 LeetCode257:给你一个二叉树的根节点root,按任意顺序ÿ…...
使用kafka还在依赖Zookeeper,kraft模式了解下
Kafka的Kraft模式 概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer,以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器…...
【100天精通Python】Day52:Python 数据分析_Numpy入门基础与数组操作
目录 1 NumPy 基础概述 1.1 NumPy的主要特点和功能 1.2 NumPy 安装和导入 2 Numpy 数组 2.1 创建NumPy数组 2.2 数组的形状和维度 2.3 数组的数据类型 2.4 访问和修改数组元素 3 数组操作 3.1 数组运算 3.2 数学函数 3.3 统计函数 4 数组形状操作 4.1 重塑数组形…...
Day01-Java基础语法
目录 1. 人机交互 1.1 什么是cmd? 1.2 如何打开CMD窗口? 1.3 常用CMD命令 1.4 CMD练习 1.5 环境变量 2. Java概述 1.1 Java是什么? 1.2下载和安装 1.2.1 下载 1.2.2 安装 1.2.3 JDK的安装目录介绍 1.3 HelloWorld小案例 2.3.1 …...
代码随想录二刷day06
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣242. 有效的字母异位词二、力扣349. 两个数组的交集三、力扣202. 快乐数四、力扣1两数之和 前言 一、力扣242. 有效的字母异位词 class Solution {pub…...
可扩展的Blender插件开发汇总
成熟的 Blender 3D 插件是令人惊奇的事情。作为 Python 和 Blender 的新手,我经常发现自己被社区中的人们创造的强大的东西弄得目瞪口呆。坦率地说,其中一些包看起来有点神奇,当自我怀疑或冒名顶替综合症的唠叨声音被打破时,很容易想到“如果有人能做出可以做xxx的东西就好…...
Chrome DevTools MCP:让 AI 编码助手拥有“浏览器之眼“
1.1 背景:AI 编程的"盲区" 在 AI 辅助编程的时代,我们已经习惯了让 AI 帮我们生成代码、修复 Bug、甚至重构项目。但长期以来,AI 编码助手有一个根本性的局限——它们只能"写"代码,却看不到代码在浏览器中实…...
LSM303DLHC六轴IMU硬件设计与磁场校准实战指南
1. LSM303DLHC 器件概述与工程定位LSM303DLHC 是意法半导体(STMicroelectronics)推出的一款高集成度、低功耗的六轴惯性测量单元(6-DoF IMU),由独立封装的三轴加速度计(LIS3DH 兼容架构)和三轴磁…...
「5 个 Markdown 文件 + 1 句提示词」让 AI 精准重构你的 React 组件 | 附完整模板
这个场景你一定经历过: 你给 ChatGPT/Claude 一个又臭又长的 React 组件,说:"帮我重构一下,让它更清晰。" 结果要么: 改错了交互逻辑,导致功能崩溃改变了接口契约,后端完全适配不了代…...
Python异步服务部署与无服务器架构实践指南
Python异步服务部署与无服务器架构实践指南 【免费下载链接】uvicorn An ASGI web server, for Python. 🦄 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn 在云原生应用开发领域,Python异步服务部署正成为构建高性能后端系统的首选方…...
老设备重生:老旧MacBook Pro系统升级完全指南
老设备重生:老旧MacBook Pro系统升级完全指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 老旧硬件适配是延长设备生命周期的关键挑战,而开源解…...
PROFINET通信进阶:S7-1200作为服务器与S7-200 SMART的高效数据交换
PROFINET通信进阶:S7-1200作为服务器与S7-200 SMART的高效数据交换 在工业自动化领域,PROFINET通信协议因其高实时性和稳定性而广受青睐。当S7-1200 PLC作为服务器与S7-200 SMART进行数据交换时,如何优化通信性能成为工程师们关注的焦点。本文…...
SpinningMomo终极指南:如何用专业工具提升《无限暖暖》摄影体验
SpinningMomo终极指南:如何用专业工具提升《无限暖暖》摄影体验 【免费下载链接】SpinningMomo 一个为《无限暖暖》提升游戏摄影体验的窗口调整工具。 A window adjustment tool for Infinity Nikki that enhances in-game photography. 项目地址: https://gitcod…...
VMWare 虚拟机中运行 Android-x86 的完整指南(新手友好版)
1. 为什么要在VMWare里跑Android-x86? 很多朋友可能好奇,明明手机就能跑安卓系统,为什么还要在电脑上折腾虚拟机?其实这个需求在开发者和极客圈里特别常见。我最早接触Android-x86是因为要测试一个APP在不同分辨率设备上的表现&a…...
如何高效抓取足球数据:SoccerData实战指南
如何高效抓取足球数据:SoccerData实战指南 【免费下载链接】soccerdata ⛏⚽ Scrape soccer data from Club Elo, ESPN, FBref, FiveThirtyEight, Football-Data.co.uk, SoFIFA and WhoScored. 项目地址: https://gitcode.com/gh_mirrors/so/soccerdata 在足…...
SQLite向量检索实战指南:Java开发者的嵌入式AI能力集成落地教程
SQLite向量检索实战指南:Java开发者的嵌入式AI能力集成落地教程 【免费下载链接】sqlite-vec Work-in-progress vector search SQLite extension that runs anywhere. 项目地址: https://gitcode.com/GitHub_Trending/sq/sqlite-vec 一、技术价值:…...
