当前位置: 首页 > news >正文

基于Spring Boot与Redis的令牌主动失效机制实现

目录

  • 前言
  • 1. 项目结构和依赖配置
    • 1.1 项目依赖配置
    • 1.2 Redis连接配置
  • 2. 令牌主动失效机制的实现流程
    • 2.1 登录成功后将令牌存储到Redis中
    • 2.2 使用拦截器验证令牌
    • 2.3 用户修改密码后删除旧令牌
  • 3. Redis的配置与测试
  • 4. 可能的扩展与优化
  • 结语

前言

在现代Web系统中,用户认证是一个核心问题,尤其是在分布式系统和微服务架构中,如何高效、安全地管理用户登录状态显得尤为重要。通常,系统通过令牌(Token)来进行身份验证,令牌的生命周期控制对于安全性非常关键。当用户修改密码等敏感操作后,确保其之前的令牌失效,是一种常用的安全策略,可以有效防止凭证被盗后恶意访问的风险。本文将详细介绍基于Spring Boot和Redis实现令牌主动失效机制的设计与实现思路,帮助读者理解和应用该方案来提高系统的安全性和稳定性。

1. 项目结构和依赖配置

首先,我们需要基于Spring Boot搭建一个简单的Web项目,同时集成Redis作为缓存数据库,用于存储和管理用户令牌的状态信息。通过引入Redis,能够有效控制令牌的失效机制,从而实现对用户认证的动态管理。
在这里插入图片描述

1.1 项目依赖配置

在项目的pom.xml中添加如下依赖,用于集成Redis:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.2 Redis连接配置

application.yml中配置Redis的连接信息:

spring:redis:host: localhostport: 6379timeout: 6000mslettuce:pool:max-active: 8max-idle: 2min-idle: 1max-wait: -1ms

该配置将连接本地的Redis实例,并定义了连接池的基本参数。具体参数根据项目需求可以进一步调整。

2. 令牌主动失效机制的实现流程

在这里插入图片描述

在实现令牌主动失效机制时,我们需要进行三步操作:

  1. 用户登录成功后,系统会生成一个Token并将其存储在Redis中。
  2. 在后续的每次请求中,通过拦截器从Redis中验证令牌的有效性。
  3. 当用户修改密码等操作成功后,系统主动删除Redis中的Token,使之前的令牌失效。

下面将逐步实现上述功能。

2.1 登录成功后将令牌存储到Redis中

首先,在用户登录成功的情况下,系统会生成一个Token。为了方便讲解,这里采用一个简单的UUID作为Token示例。生成的Token不仅返回给前端,也会同步存储到Redis中,并设置一定的有效时间(如1小时)。

示例代码如下:

@Autowired
private StringRedisTemplate stringRedisTemplate;public String login(String username, String password) {// 生成TokenString token = UUID.randomUUID().toString();// 将Token存储到Redis中,有效期1小时ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();operations.set(token, token, 1, TimeUnit.HOURS);// 返回给用户的响应中包含Tokenreturn token;
}

上述代码通过StringRedisTemplateopsForValue方法,将Token以键值对的形式存储到Redis中。Redis缓存会定时清除过期数据,因此可以避免手动管理令牌的过期处理。

2.2 使用拦截器验证令牌

每次用户请求时,我们需要验证用户携带的Token是否有效。通过Spring的拦截器机制,可以在请求进入控制器之前检查Redis中的Token,判断其是否有效。若Token无效或已过期,则拒绝访问。

拦截器代码如下:

public class LoginInterceptor implements HandlerInterceptor {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 从请求头中获取TokenString token = request.getHeader("Authorization");if (token == null || token.isEmpty()) {throw new RuntimeException("缺少令牌");}// 从Redis中查询TokenValueOperations<String, String> operations = stringRedisTemplate.opsForValue();String redisToken = operations.get(token);if (redisToken == null) {// Token不存在或已过期,抛出异常throw new RuntimeException("无效的令牌");}// Token有效,继续处理请求return true;}
}

LoginInterceptor中,我们通过StringRedisTemplateopsForValue方法获取Redis中的Token并与请求携带的Token对比。如果Token不存在,则直接拒绝该请求。若Token存在且有效,继续进行请求处理。

2.3 用户修改密码后删除旧令牌

当用户成功修改密码时,需要确保之前的Token立即失效。因此,成功修改密码后,我们需要从Redis中删除该用户的Token记录,防止旧Token被再次使用。

在修改密码的业务逻辑中,加入删除Token的代码:

public void changePassword(String username, String newPassword) {// 假设用户验证通过并修改了密码// 删除Redis中的旧TokenString token = getCurrentTokenForUser(username); // 从上下文或数据库中获取当前用户的TokenValueOperations<String, String> operations = stringRedisTemplate.opsForValue();operations.getOperations().delete(token);
}

在上述代码中,通过getOperations().delete()方法删除Token,使得旧Token立即失效。这样用户在修改密码后需要重新登录,保证了账户的安全性。

3. Redis的配置与测试

为了确保上述逻辑的正确性和Redis的稳定性,建议在开发阶段通过单元测试验证Redis的连接和数据操作。

@SpringBootTest
class RedisTest {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testpublic void testSet() {ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();operations.set("username", "zhangsan");operations.set("id", "1", 15, TimeUnit.SECONDS);// 检查存储的值String username = operations.get("username");System.out.println("用户名:" + username);}
}

以上代码将usernameid存储到Redis中,并设置了15秒的有效期。通过单元测试,可以直观地验证Redis的写入和有效期的功能是否正常工作。

4. 可能的扩展与优化

在实际应用中,可以进一步对该令牌失效机制进行扩展和优化:

  • 基于用户ID管理Token:可以在Redis中以userId为键,存储用户当前的Token,这样方便管理用户的多个Token(如多设备登录)。
  • 使用JWT(JSON Web Token):在Token中加入用户的相关信息(如用户ID、权限等),以减少对Redis的依赖。不过仍需在修改密码等场景下失效Token。
  • 动态调整Token有效期:可以根据用户的活跃度或敏感操作动态调整Token的过期时间,进一步提高系统的灵活性。

结语

本文详细介绍了基于Spring Boot和Redis实现令牌主动失效机制的完整流程,并提供了关键代码示例。通过将Token存储在Redis中并在必要时主动删除,确保了用户在修改密码等操作后的Token立即失效,从而有效增强了系统的安全性。这种方案在实际开发中具有良好的应用价值。通过适当扩展和优化,还可以满足更复杂的业务需求,为用户提供更优质的服务体验。

相关文章:

基于Spring Boot与Redis的令牌主动失效机制实现

目录 前言1. 项目结构和依赖配置1.1 项目依赖配置1.2 Redis连接配置 2. 令牌主动失效机制的实现流程2.1 登录成功后将令牌存储到Redis中2.2 使用拦截器验证令牌2.3 用户修改密码后删除旧令牌 3. Redis的配置与测试4. 可能的扩展与优化结语 前言 在现代Web系统中&#xff0c;用…...

深度学习之循环神经网络(RNN)

1 为什么需要RNN&#xff1f; ​ 时间序列数据是指在不同时间点上收集到的数据&#xff0c;这类数据反映了某一事物、现象等随时间的变化状态或程度。一般的神经网络&#xff0c;在训练数据足够、算法模型优越的情况下&#xff0c;给定特定的x&#xff0c;就能得到期望y。其一…...

Autosar CP Network Management模块规范导读

Network Management模块的主要功能 网络管理适配:作为通信管理器和总线特定网络管理模块之间的适配层,实现不同总线网络管理功能的统一接口,确保系统中各种网络的协同工作。协调功能 网络协调关闭:使用协调算法协调多个网络的关闭,确保它们在合适的时间同步进入睡眠模式,…...

Xshell 7 偏好设置

1 Xshell7 工具——更改用户数据文件夹 就是此电脑目录下的文档 该目录下的7 Xshell下的 applog ColorScheme Files 配色方案文件目录 HighlightSet Files 突出显示集目录 Logs 日志 QuickButton Files 快速命令集 Scripts 脚本文件 Sessions 会话文件 会话文件目录就…...

云计算答案

情境一习题练习 一、选择题 1、在虚拟机VMware软件中实现联网过程&#xff0c;图中箭头所指的网络连接方式与下列哪个相关&#xff08; C &#xff09;。 A.仅主机模式 B.桥接 C.NAT D.嫁接 2、请问下图这个虚拟化架构属于什么类型&#xff08; A …...

浅谈现货白银与白银td的价格差异

西方资本主义世界崇尚自由经济&#xff0c;而我国实行社会主义市场经济&#xff0c;因此二者在金融系统上存在不少差异&#xff0c;反映在贵金属市场中&#xff0c;可能直接表现为价格上的差异。如果投资者对此能有基本的了解&#xff0c;日后面对交易中的特殊价格波动&#xf…...

【QT常用技术讲解】任务栏图标+socket网络服务+开机自启动

前言 首先看网络编程的定义&#xff1a;两个不同主机设备之间的进程通信。C/S(Client-Server)是早期非常典型的软件架构&#xff0c;C/S架构虽然简单&#xff0c;但却非常适用于桌面图形化的QT项目。 本篇的QT项目是从真实的项目中简化出来&#xff0c;满足很多相似的场景&…...

【计算机基础——数据结构——AVL平衡二叉树】

1. BST二叉查找树 1.1 BST二叉查找树的特性 左子树上所有结点的值均小于或等于它的根结点的值。右子树上所有结点的值均大于或等于它的根结点的值。左、右子树也分别为二叉排序树。 1.2 BST二叉查找树的缺点 二叉查找树是有缺点的&#xff0c;在不断插入的时候&#xff0c;…...

体育活动赛事报名马拉松微信小程序开发

功能描述 体育活动赛事报名马拉松微信小程序&#xff0c;该项目是一个体育活动报名小程序&#xff0c;主要功能有活动报名、扫码签到、签到积分、排行奖励、积分兑换等功能。 用户端&#x1f536;登录&#xff1a;◻️1.微信授权登录 ◻️2.手机号码授权 &#x1f536;首页&am…...

【C++】C++基础知识

一.函数重载 1.函数重载的概念 函数重载是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的同名函数&#xff0c;这些同名函数的形参列表必须不同。函数重载常用来处理实现功能类似&#xff0c;而数据类型不同的问题。 #include <iostream> using…...

中间件安全

IIS IIS短文件漏洞 此漏洞实际是由HTTP请求中旧DOS 8.3名称约定(SFN)的代字符(~)波浪号引起的。它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问)。攻击者可以找到通常无法从外部直接访问的重要文件,并获取有关应用程序基础结构的信息。 利用工具 https…...

Zabbix中文监控指标数据乱码

1&#xff09;点击主机&#xff0c;选择Zabbix server 中的 图形 一项&#xff0c;可以看到当前显示的为乱码 2&#xff09; 下载字体文件&#xff1a; https://gitcode.com/open-source-toolkit/4a3db/blob/main/SimHei.zip 解压unzip -x SimHei.zip 3&#xff09; 替换字体文…...

【AI】AI如何赋能软件开发流程

方向一&#xff1a;流程与模式介绍【传统软件开发 VS AI参与的软件开发】 传统软件开发流程 传统软件开发流程一般可以分为以下几个阶段&#xff1a; 1. 需求分析&#xff1a;在这个阶段&#xff0c;开发团队与客户沟通&#xff0c;明确软件的需求和目标。团队会收集、整理和分…...

恒创科技:什么是 RAID 3 ? RAID 3、4 和5之间有什么区别?

RAID 是一种存储数据以提高性能并减少数据丢失的特定技术。您可以根据自己的需求选择多种 RAID 类型。RAID 3 是列表中比较有效的类型之一。本文将重点介绍这种特定的 RAID 技术&#xff0c;并比较 RAID 3、4 和 5。 RAID 3 的定义 RAID 3 是一种特定的磁盘配置&#xff0c;用于…...

python获取iOS最近业务日志的两种方法

当iOS UI自动化用例执行失败的时候&#xff0c;需要获取当时的业务日志&#xff0c;供后续分析使用。 现在已经把iOS沙盒目录挂载到本地&#xff0c;剩下的事情就是从沙盒目录中捞取当前的日志&#xff0c;沙盒中的日志文件较大&#xff0c;整体导出来也可以&#xff0c;但是会…...

【如何获取股票数据43】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深指数历史交易数据获取实例演示及接口API说明文档

最近一两年内&#xff0c;股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步&#xff0c;就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息&#xff0c;这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任…...

ESLint 使用教程(一):从零配置 ESLint

前言 在现代前端开发中&#xff0c;代码质量和风格一致性是团队合作和项目维护的重要因素。而 ESLint 作为一款强大的 JavaScript 静态代码分析工具&#xff0c;能够帮助开发者发现和修复代码中的潜在问题。本文将详细介绍 ESLint 的常用规则配置&#xff0c;并结合实际应用场…...

openssl对称加密代码讲解实战

文章目录 一、openssl对称加密和非对称加密算法对比1. 加密原理2. 常用算法3. 加密速度4. 安全性5. 应用场景6. 优缺点对比综合分析 二、代码实战代码说明&#xff1a;运行输出示例代码说明&#xff1a;注意事项 一、openssl对称加密和非对称加密算法对比 OpenSSL 是一个广泛使…...

web前端动画按钮(附源代码)

效果图 源代码 HTML部分 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> …...

go函数传值是值传递?还是引用传递?slice案例加图解

先说下结论 Go语言中所有的传参都是值传递&#xff08;传值&#xff09;&#xff0c;都是一个副本&#xff0c;一个拷贝。 值语义类型&#xff1a;参数传递的时候&#xff0c;就是值拷贝&#xff0c;这样就在函数中就无法修改原内容数据。 基本类型&#xff1a;byte、int、bool…...

PostgreSQL数据库笔记

PostgreSQL 是什么 PostgreSQL&#xff08;简称Postgres或PG&#xff09;是一个功能强大、可靠性高、可扩展性好的开源对象-关系数据库服务器&#xff08;ORDBMS&#xff09;&#xff0c;它以加州大学伯克利分校计算机系开发的POSTGRES版本4.2为基础。 发展历程 起源与发展&a…...

财务软件源码SaaS云财务

在如今的商业环境中&#xff0c;准确的财务管理是一家企业取得成功的关键。然而&#xff0c;传统的财务管理方法已经无法满足现代企业的需求&#xff0c;需要一个全新的解决方案。推出了全新的财务软件为您提供完美的解决方案。 选择财务软件源码&#xff0c;您将享受到以下优…...

Elasticsearch集群和Kibana部署流程

搭建Elasticsearch集群 1. 进入Elasticsearch官网下载页面&#xff0c;下载Elasticsearch 在如下页面选择Elasticsearch版本&#xff0c;点击download按钮&#xff0c;进入下载页面 右键选择自己操作系统对应的版本&#xff0c;复制下载链接 然后通过wget命令下载Elastics…...

丹摩征文活动 | 丹摩智算:大数据治理的智慧引擎与实践探索

丹摩DAMODEL&#xff5c;让AI开发更简单&#xff01;算力租赁上丹摩&#xff01; 目录 一、引言 二、大数据治理的挑战与重要性 &#xff08;一&#xff09;数据质量问题 &#xff08;二&#xff09;数据安全威胁 &#xff08;三&#xff09;数据管理复杂性 三、丹摩智算…...

【Django】Clickjacking点击劫持攻击实现和防御措施

Clickjacking点击劫持 1、clickjacking攻击2、clickjacking攻击场景 1、clickjacking攻击 clickjacking攻击又称为点击劫持攻击&#xff0c;是一种在网页中将恶意代码等隐藏在看似无害的内容&#xff08;如按钮&#xff09;之下&#xff0c;并诱使用户点击的手段。 2、clickj…...

Ansys Zemax | 手机镜头设计 - 第 4 部分:用LS-DYNA进行冲击性能分析

该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念和设计到制造和结构变形分析。本文是四部分系列中的第四部分&#xff0c;它涵盖了相机镜头的显式动态模拟&#xff0c;以及对光学性能的影响。使用Ansys Mechanical和LS-DYNA对相机在地板上的一系列冲击和弹跳过程…...

工具收集 - java-decompiler / jd-gui

工具收集 - java-decompiler / jd-gui 参考资料 用法&#xff1a;拖进来就行了 参考资料 https://github.com/java-decompiler/jd-gui 脚本之家&#xff1a;java反编译工具jd-gui使用详解...

《无线重构世界》射频模组演进

射频前端四大金刚 射频前端由PA、LNA、滤波器、开关“四大金刚” 不同的模块有自己的工艺和性能特点 分层设计 射频前端虽然只由PA、LNA、开关、混频器4个模块构成&#xff0c;但不同模块之间相互连接且相互影响。如果将射频系统当成一个整体来理解&#xff0c;其中的细节和…...

渗透测试---docker容器

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人一律不承担一切后果 目录 一、Docker的作用与优势 二、docker的核心…...

【go从零单排】Atomic Counters原子计数

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;原子计数器&#xff08;Atomic Counters&#xff09;是…...

css做网站怎么添加子页/定制建站网站建设

本文实例讲述了java实现简单的英文文本单词翻译器功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;直接上代码&#xff1a;package fanyi;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExceptio…...

网站的产品中心怎么做/成都达洱狐网络科技有限公司

感谢各位的点击观看&#xff0c;如有错误或不足&#xff0c;欢迎前辈们指正&#xff1b;如有疑问&#xff0c;欢迎提问&#xff0c;一起讨论&#xff1b;如对你有帮助&#xff0c;动动小手点个赞哦&#xff01;今天介绍的是绝对值编码器&#xff0c;提到编码器&#xff0c;很多…...

小果视界怎么推广赚钱/长沙seo 优化选智投未来no1

Cooler Master酷冷至尊在本届Computex上发布了即将上市的全系列散热解决方案产品&#xff0c;包括新3DVVC技术、一体化双冷头水冷和全新MasterFan SF系列风扇。MasterAir Maker 3DVVC MasterAir Maker 3DVVC采用垂直式均热板导热技术。不同于传统的热管散热技术&#xff0c;这款…...

网站开发使用软件环境/河南网站seo

buidroot是一个很强大的工具 里面集成了busybox &#xff0c;make busybox-menuconfig可以配置busybox中断额选项 首先 安装必要的支持库 运行 sudo apt-get install libc6:i386 libstdc6:i386 libncurses5:i386 zlib1g:i386 安装依赖库一完成后 make menuconfig Tar…...

企业网站建设案例分析/网站seo诊断工具

昨天教务的一个同事&#xff0c;提出有没有办法可以对169门考试&#xff08;合计1744个学生&#xff09;进行考试安排。因为是期末考试补考。因此其中很多考试存在学生冲突现象。 例如&#xff1a; (英语翻译2-2<--->英语听力4-4) ID:200616031109(英语专业四级培训-3<…...

网站做的比较好的/seo搜索引擎实战详解

文章目录一、复习bs4二、selenium之前三、大总结&#xff08;细节&#xff09;3.1settings.py修改3.2UA设置3.3反爬3.4运行不成功3.5翻页3.6保存图片四、settings.py文件的补充五、hashlib (一种加密方式)六、类知识点回顾一、复习bs4 xpath:记语法、copy (full) xpath bs4:(三…...