You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot集成JWT时token过期如何刷新并为用户颁发新token?

Spring Boot JWT 过期自动刷新Token实现方案

核心实现思路

采用双Token机制拆分鉴权能力:

  • 短有效期的access_token:用来做业务接口鉴权,有效期建议调整为1~2小时,降低泄露风险
  • 长有效期的refresh_token:仅用来刷新access_token,有效期可设置为7~30天,不支持直接访问业务接口

具体实现步骤

1. 调整登录接口的Token签发逻辑

用户登录成功后,同时下发两个Token,同时将refresh_token和用户ID的绑定关系存入Redis(设置和refresh_token相同的过期时间),方便后续校验和主动作废。

2. 全局捕获Token过期异常

在JWT请求过滤器或者全局异常处理器中,捕获ExpiredJwtException异常,返回约定好的特殊状态码(比如4011)给前端,前端识别到该状态码后自动调用刷新Token接口,无需用户手动重新登录。

3. 开发刷新Token专用接口

接口逻辑如下:

  • 接收前端传入的refresh_token,首先校验其签名合法、未过期
  • 到Redis中校验该refresh_token是否和对应用户的存储记录一致,排除伪造、已作废的refresh_token
  • 校验通过后,生成新的access_token返回给前端,也可根据需求生成新的refresh_token(滚动刷新机制),旧refresh_token直接从Redis中删除
  • 前端拿到新token后替换本地存储的旧token,用新token重新发起之前失败的请求即可

4. 可选优化:配置时钟偏移容错

你当前报错信息显示允许的时钟偏移为0,服务端和客户端的少量时间差就会触发过期误判,可以在JWT解析逻辑中增加时钟偏移配置:

// io.jsonwebtoken 版本的配置示例
Jwts.parserBuilder()
    .setSigningKey(yourSecretKey)
    .setAllowedClockSkewSeconds(60) // 允许60秒的时钟误差
    .build()
    .parseClaimsJws(token);

注意事项

  • refresh_token泄露会带来安全风险,需要支持主动作废能力:用户登出、修改密码时,直接删除Redis中对应的refresh_token
  • 若refresh_token也已过期,直接返回需要重新登录的状态码,引导用户重新走登录流程
  • 业务接口不允许使用refresh_token进行鉴权,避免长有效期Token被滥用

内容的提问来源于stack exchange,提问作者hanjiman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:27:00