基于Redis实现JWT Token无感续期:Spring Boot实战方案

JWTRedisToken续期
于 2026-07-03 10:01:59 修改
·本内容遵循CC 4.0 BY-SA版权协议

1. 项目概述与核心价值

在构建现代Web应用,特别是前后端分离架构时,身份认证与授权是绕不开的核心环节。JWT(JSON Web Token)因其无状态、自包含的特性,成为许多开发者的首选方案。然而,无状态这把“双刃剑”也带来了一个经典难题:如何优雅地处理Token的有效期?设置太短,用户频繁被迫重新登录,体验极差;设置太长,又带来严重的安全风险。我最近在重构一个用户量级不小的后台管理系统时,就深度实践了基于Redis的Token在线续期方案,它完美地在安全与体验之间找到了平衡点。这个方案的核心思想,不是简单粗暴地延长JWT本身的过期时间,而是引入一个“活跃会话”的概念,通过Redis这个高性能的内存数据库来记录和管理用户的活跃状态,从而实现无感续期。简单来说,只要用户在持续操作,他的会话就能一直保持有效,一旦闲置超过预设时间,会话才会真正过期。下面,我就把这个从设计思路到代码落地的完整过程,以及踩过的坑和优化心得,毫无保留地分享出来。

2. 整体架构设计与核心思路拆解

2.1 为何选择“Redis + JWT”的组合?

首先,我们需要明确为什么不能单靠JWT来实现续期。JWT一旦签发,其载荷(Payload)中的过期时间(exp)就固定了,服务端无法单方面修改一个已签发Token的内容。强行续期意味着要重新签发一个新Token,这涉及到如何安全地将新Token下发给客户端,以及如何处理旧Token的失效问题,流程会变得复杂。

而Redis的引入,正是为了解决这个“状态管理”的问题。我们将JWT的“无状态认证”与Redis的“有状态会话管理”相结合,形成一种混合模式:

  1. JWT负责短期认证:Token本身仍携带一个相对较短的有效期(例如30分钟),用于快速验证请求的合法性和携带基础用户信息。
  2. Redis负责长期会话:在Redis中存储一个与用户关联的会话记录,其有效期远长于JWT(例如7天)。这个记录标识了用户的“活跃会话窗口”。

当用户携带一个未过期的JWT发起请求时,系统不仅校验JWT,还会去Redis检查对应的会话记录是否存在且有效。如果存在,则视为活跃用户,并触发续期逻辑——重置Redis中该会话记录的过期时间。这样,只要用户在持续活动,他的会话就能通过Redis不断“续命”。

2.2 核心流程与数据模型设计

整个流程可以概括为“登录存、请求验、活跃续、登出删”。

数据模型设计: 在Redis中,我们需要一个结构来存储会话。通常使用StringHash类型。

  • Key的设计session:${userId}token:${jti}。使用userId更直观,便于按用户管理所有会话;使用JWT的jti(JWT ID)则更精准,一个Token对应一个会话。我推荐使用session:${userId},因为更符合“用户会话”的业务概念。
  • Value的设计:可以存储简单的标志(如"ACTIVE"),也可以存储一些额外信息,如登录时间、客户端信息等。为了后续可能的扩展,我选择存储一个JSON字符串。
  • 过期时间(TTL):这就是我们为会话设置的“最大不活跃持续时间”,例如604800秒(7天)。

核心流程步骤:

  1. 登录成功:生成JWT(设30分钟过期),同时,以userId为键,将会话信息存入Redis,并设置TTL为7天。
  2. 携带Token请求:拦截请求,从Authorization头解析JWT。
    • 校验JWT签名和基本有效期(30分钟内)。
    • 从JWT中提取userId,构造Redis Key去查询会话是否存在。
    • 若会话不存在,返回401,提示登录已过期。
    • 若会话存在,执行续期:重置该Redis Key的TTL为7天(从头计算)。
  3. Token过期但会话活跃:这是关键场景。当JWT的30分钟过期后,但Redis中的会话还在7天有效期内。
    • 方案一(推荐):在JWT校验逻辑中,对于已过期的Token,如果其过期时间在一个可接受的“宽限期”内(如5分钟),并且Redis会话仍有效,则允许请求通过,并同时签发一个新的JWT返回给客户端(通常通过响应头,如X-New-Token)。
    • 方案二:前端在Token即将过期时(通过定时器或请求拦截),主动调用一个/refresh接口,该接口校验Redis会话后签发新Token。
  4. 登出/修改密码:直接删除对应用户在Redis中的会话记录。这样,即使旧的JWT尚未过期,也会因会话不存在而被拒绝。

注意:方案一(滑动过期+静默刷新)对前端更友好,实现了真正的无感续期。但需要前端配合处理可能的新Token。方案二需要前端主动管理,逻辑稍显复杂。

3. 核心组件实现与代码详解

接下来,我们进入实战环节,基于Spring Boot一步步实现上述逻辑。我会假设你已经有一个基础的Spring Boot项目,并整合了Spring Security、JWT和Redis。

3.1 环境准备与依赖引入

首先,在pom.xml中添加必要的依赖:

XML
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Spring Data Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- JWT 解析库 (这里选用 auth0 java-jwt) -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
<!-- 配置文件处理器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

application.yml中配置Redis连接:

YAML
spring:
redis:
host: localhost
port: 6379
# password: yourpassword # 如果有密码
database: 0
timeout: 2000ms
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0

3.2 JWT工具类与Redis会话服务封装

我们需要一个工具类来生成和解析JWT,以及一个服务来管理Redis中的会话。

JWT工具类 (JwtUtil):

JAVA
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
 
@Component
public class JwtUtil {
// 从配置文件注入,建议使用强密钥并妥善保管
@Value("${jwt.secret:your-256-bit-secret}")
private String secret;
// JWT短期过期时间,单位毫秒
@Value("${jwt.expire-time:1800000}")
private long jwtExpireTime;
// Token刷新宽限期,单位毫秒
@Value("${jwt.refresh-grace-period:300000}")
private long refreshGracePeriod;
 
/**
* 生成JWT Token
* @param userId 用户ID
* @return JWT字符串
*/
public String generateToken(String userId) {
Date now = new Date();
Date expireDate = new Date(now.getTime() + jwtExpireTime);
// 可以将jti也存入,这里简化使用userId
return JWT.create()
最低 0.47元/天 开通会员,解锁全文
left
成为会员后, 你将解锁
right
benefits 下载资源随意下
benefits 优质VIP博文免费学
benefits 优质文库回答免费看
benefits 付费资源9折优惠
Sa-Token鉴权实战[可运行源码]
Sa-Token 是一款轻量级、高性能、易上手的 Java 权限认证框架,专为微服务架构与前后端分离场景深度优化。其核心设计理念是“去复杂化、重实用、强扩展”,彻底摒弃了传统 Spring Security 中繁杂的 XML 配置、多层 Filter 链、AuthenticationManager、ProviderManager、SecurityContext 等抽象层级,以极简 API + 零配置(或极少配置)的方式实现完整的会话管理、登录认证、角色权限控制、多端登录、单点登录(SSO)、Token 续签、分布式 Token 同步、黑名单/白名单管控等企业级鉴权能力。在本实战项目《Sa-Token鉴权实战[可运行源码]》中,作者并未停留在单体应用层面,而是将 Sa-TokenSpring Cloud 生态关键组件——Spring Cloud Gateway(网关)和 Nacos(注册中心 & 配置中心)进行深度集成,构建出一套生产就绪、高可用、可水平扩展的分布式鉴权体系。首先,在 Sa-Token 模块中,项目完成了完整的 token 生命周期管理闭环登录时调用 `StpUtil.login(userId)` 即可生成标准 JWT 或 UUID Token(默认),并自动绑定用户 ID、设备类型、登录时间、过期时间等元信息至底层 Redis(或内存/数据库等自定义 SessionStore);通过 `StpUtil.getTokenValue()` 可安全提取当前请求携带的 Token 字符串;`StpUtil.checkLogin()` 实现无感登录校验;而 `StpUtil.hasRole("admin")` 与 `StpUtil.hasPermission("sys:user:delete")` 则构成 RBAC 权限模型的基础支撑。尤为关键的是,项目实现了 `StpInterface` 接口,该接口是 Sa-Token 的权限数据桥接核心——开发者需重写 `getPermissionList(Object loginId, String loginType)` 和 `getRoleList(Object loginId, String loginType)` 方法,从而解耦权限来源,支持从 MySQL、Redis、Nacos 配置、甚至远程 HTTP 接口(如调用权限中心服务)动态拉取角色与权限列表,真正实现权限数据的集中化、可配置化与热更新能力。其次,在 Gateway 层,项目摒弃了传统在每个业务服务中重复编写拦截器的做法,转而利用 Spring Cloud Gateway 的 GlobalFilter 机制,统一注入 Sa-Token 的鉴权逻辑。具体实现中,自定义 `AuthGlobalFilter` 拦截所有下游请求,解析 Authorization Header 中的 Bearer Token,调用 `StpUtil.isLogin()` 进行有效性验证,并通过 `StpUtil.getTokenValue()` 提取 Token 后交由 `StpUtil.getTokenSession()` 获取会话上下文,进而完成身份识别;更进一步,借助 `StpUtil.checkPermission("xxx")` 或 `StpUtil.checkRole("xxx")` 实现路由粒度的访问控制(例如/api/admin/** 路径仅允许 admin 角色访问)。该设计不仅大幅降低业务模块侵入性,还确保了全链路鉴权策略的一致性与可维护性。值得注意的是,网关本身不持有任何用户凭证或权限逻辑,所有鉴权判断均委托给 Sa-Token 内部机制,而 Sa-Token 的 SessionStore 可无缝对接 Nacos 配置中心——例如将 Token 过期时间、踢人策略、同端互斥开关等参数外置为 Nacos 配置项,实现运行时动态调整,无需重启服务。再者,项目深入对比并实现了两种高性能权限数据加载模式其一是基于 `CompletableFuture.supplyAsync()` 的异步非阻塞调用,当 `StpInterface` 中需远程查询权限时,避免主线程阻塞,提升网关吞吐量;其二是响应式编程风格(WebFlux + Mono/Flux),适配 Gateway 的响应式内核,通过 `Mono.fromSupplier(() -> loadPermissions(loginId))` 实现零线程切换的权限加载,兼顾性能与资源利用率。这两种方式并非互斥,而是根据实际技术栈选型灵活组合若业务系统已全面响应式化,则优先选用 Flux 方案;若仍以 Servlet 为主,则 CompletableFuture 更易落地。此外,项目源码中还涵盖 Token 自动续期(`StpUtil.renewTimeout()`)、多账号体系支持(`loginId + loginType` 多维标识)、注解式鉴权(`@SaCheckRole`, `@SaCheckPermission`)、前后端分离下的跨域与 Cookie 安全配置(SameSite、HttpOnly、Secure)、以及与 Nacos 服务发现联动实现灰度鉴权路由等高级特性。最后,该实战项目的价值远不止于代码演示它提供了一套可直接部署、可二次开发、可横向扩展的企业级鉴权参考架构。压缩包中的源码结构清晰分层——sa-token-core(鉴权核心)、gateway-auth(网关鉴权模块)、user-service(模拟用户服务)、nacos-config(Nacos 配置样例),每个模块均附带详细 README 与启动说明;所有依赖版本经过严格兼容性测试(如 Sa-Token v1.38+、Spring Boot 2.7.x / 3.x、Spring Cloud 2021.x / 2022.x);关键配置项(如 Redis 地址、Nacos server-addr、JWT 秘钥)均采用配置中心外置;日志埋点完整,便于线上问题追踪;同时预留了 Prometheus 监控指标接入点与 Sentinel 流控熔断扩展位点。对于中大型 Java 微服务团队而言,此项目不仅是学习 Sa-Token 最佳实践的权威范本,更是快速构建安全、稳定、合规的统一身份认证平台的坚实底座——它用事实证明鉴权不必复杂,安全亦可极简。
编译布丁
springboot整和jwt、shiro、redis实现token自动刷新
下面将详细介绍如何在Spring Boot中整合JWT、Shiro和Redis实现Token自动刷新。
蔡定努
6425
springboot+redis+token保持登录
下面是如何使用Spring BootRedisToken实现登录保持的步骤1.
超级二师兄
20706
SpringBoot_Shiro_JWT_Redis:SpringBoot整合Shiro、JWTRedis实现token登录授权验证以及token刷新
本文介绍了Spring Boot项目的Maven配置文件,涵盖了项目基本信息、依赖管理及构建设置。重点包括数据持久化、Web开发、测试支持,以及JWT认证、Redis存储和Shiro安全框架的相关依赖
崔迪潇
3804
STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWTRedis操作、日志和统一异常处理)
实现JWT)、Redis缓存操作、日志记录以及统一异常处理。
小飞鹤
636
Spring boot整合shiro+jwt实现前后端分离
Spring Boot 整合 Shiro+JWT 实现前后端分离Spring Boot 框架是一个流行的 Java 框架,用于构建 Web 应用程序。
weixin_38618540
5433
基于springboot+jwt实现刷新token过程解析
实现细节在实现中,我们使用了JWT来生成Token,并使用Redis来存储Token和refToken。
weixin_38741195
8546
spring-boot系列,使用JWT实现登录认证、完整的前后台交互的系统设计案例
在本项目中,我们主要探讨的是如何利用Spring Boot框架构建一个使用JWT(JSON Web Token)进行登录认证,并结合Redis进行权限管理的完整前后台交互系统。
NikoLas_Wu
2103
Token刷新机制通过refreshToken实现无感续期是什么
本文详细介绍了Token刷新机制,特别是refreshToken的使用,以实现用户认证的无感续期。首先解释了refreshToken的必要性,包括安全性和用户体验的考量。接着,详细阐述了refreshToken的工作原理和核心流程,包括首次登录、Access Token过期后的处理以及Refresh Token过期后的用户重新登录。文章还探讨了关键的安全设计,如存储隔离、传输安全、刷新限制和黑名单机制。最后,通过Spring Boot的代码实现示例,展示了如何在实际开发中应用refreshToken机制,并对比了不同方案的优缺点。
筱恪
API安全验证实战:Spring Boot拦截器集成Token+Sign+Timestamp三要素(附60秒超时配置)
本文介绍在Spring Boot中通过拦截器集成Token身份认证、Sign参数签名防篡改和Timestamp防重放攻击三大安全要素的实战方案。涵盖JWT Token验证与无感续期、HMAC-SHA256签名生成与校验、60秒时间窗口+Redis请求去重机制,并包含拦截器完整实现、性能优化(如SecretKey缓存、异步日志)及生产部署注意事项。
外币兑换
274
Spring Boot实战系列】JWT还是Redis-Token?认证方案选型与实战
本文围绕Spring Boot后台系统的身份认证方案展开,深入对比JWTRedis-Token两种主流Token机制在无状态性、会话控制、失效处理、刷新续期及权限缓存等方面的技术差异与适用场景。重点解析Token结构设计(jti、version)、双Token无感刷新机制、Read-Through权限缓存策略(Redis Hash实现)以及多登录方式扩展原理,提供可落地的工程化实践方案
有来技术
19799
SpringBoot中基于JWt的授权与续期方案
本文围绕Spring Boot项目的登录注册方案展开,分析了Cookie、Session、Security、Shiro和JWT的优缺点。重点介绍了Redis+Token和基于JWT的单token、双token授权与续期方案,包括基本原理、流程,以及解决token过期续期的策略和实现方式。
喵小狸
1242
SpringBoot中Token登录授权、续期和主动终止的方案
本文围绕Spring Boot项目登录注册方案展开。指出Cookie或Session有状态,Security或Shiro实现复杂,JWT有缺点。详细介绍了Redis+TokenJWT两种授权流程,分析了JWT续签和终止问题及解决方案,如临近过期刷新JWT、用Redis实现JWT主动终止等。
程序员1970
7917
JWT 续签方案解析与实战
JWT是常用身份验证方式,但固定过期时间影响用户体验,因此需要续签方案。本文介绍了JWT基本概念,详细解析了短Token+刷新Token、滑动过期、基于Redis存储Token状态三种续签方案的原理、优缺点及适用场景,还给出Spring Boot实战代码,并提及选择合适方案的要点。
小健学 Java
2815
5步实现Spring Boot中的双Token(access_token + refresh_token)授权与续期
本文详细介绍在Spring Boot项目中实现基于JWT的双Token(access_token + refresh_token)授权与续期功能。内容涵盖环境准备,包括添加依赖、配置RedisToken生成与验证;用户认证与Token管理;Token续期;主动终止Token等步骤,使用RedisToken管理更灵活高效。
墨瑾轩
4289
redis + jwt实现token认证
本文详细介绍如何使用JWTRedis实现前后端分离项目的权限管理,包括登录授权、登出、续期及获取新token的流程。
Kevin_cai09
8794
Spring Boot+Vue双Token无感刷新认证方案实战
本文基于Spring Boot与Vue构建双Token(Access Token+Refresh Token)认证体系,利用JWT实现无状态鉴权,并通过Redis管理Refresh Token状态以支持主动吊销、设备绑定与并发安全。详细阐述服务端Token生成/校验/刷新接口实现、前端Axios拦截器无感续期逻辑,以及分布式环境下的安全加固策略。
weixin_30633405
400
Spring Boot 3.2 + JWT 登录认证实战:5步集成与Token自动续期方案
本文详解Spring Boot 3.2环境下JWT登录认证的5步集成方案,涵盖Token生成验证、Spring Security配置、Redis状态管理、基于阈值的自动续期策略(含并发锁处理),以及生产级安全增强(密钥轮换、Claims校验、HTTPS强制)和性能优化(RS256加密、Payload精简、HTTP/2压缩)。强调无状态认证在微服务中的落地实践。
weixin_34409357
292
基于Spring Boot 3 + Spring Security6 + JWT + Redis实现登录、token身份认证
本文介绍如何基于Spring Boot 3与Spring Security 6结合JWTRedis实现登录及token身份认证。涵盖自定义登录过滤器、AuthenticationProvider、UserDetailsService实现,并利用Redis管理token有效期与用户状态,支持登出机制与token续期,提升系统安全性与用户体验。
百***9963
750
JWT生成token及过期和自动续期
介绍了一种基于JWT的用户认证方案,该方案通过在Redis中缓存Token并自动续期实现用户免登录功能。
jq1223
7074
Spring Boot + Redis:实现Token登录授权、续期与主动终止的终极指南
本文是Spring Boot结合Redis实现Token登录授权、续期与主动终止的指南。先介绍环境准备,包括添加依赖和配置Redis;接着阐述Token生成与验证、用户认证与Token管理的实现;还说明了Token续期和主动终止的方法。使用Redis可让Token管理更灵活高效。
墨瑾轩
904
SpringBoot双Token方案:JWT access_token与refresh_token实战
本文详解SpringBoot中基于JWT的access_token与refresh_token双令牌方案,涵盖职责分离、HttpOnly Cookie安全传输、一次性refresh_token设计、Redis黑名单与设备指纹绑定、Payload精简原则及高并发下的Redis优化策略。重点解决无状态架构下认证续期、安全审计与用户体验的平衡问题,提供可落地的四步实现与线上高频问题诊断链路。
weixin_30565199
686