【学习笔记】解决 JWT 解析报错:Claims claims = JwtUtil.parseJWT(...) Error Code 401(token过期)
在学习《苍穹外卖》 Web 项目的过程中,我在解析 JWT 时遇到了一次报错。这里记录下整个排查与解决的过程,方便日后复盘,也能帮助遇到同样问题的小伙伴。
一、问题描述
在代码中,我尝试解析一个 JWT:
Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);
运行后直接报错,在线文档提示响应码 401。一开始不确定问题出在哪,只能逐步排查。
使用debug模式运行后,发现 claims
的值居然是null,所以下面进一步对于这条语句进行检查:


二、可能的原因分析
结合错误信息和常见情况,这里总结了几种可能性:
-
配置文件中的密钥不一致
jwtProperties.getAdminSecretKey()
获取到的密钥,和生成 Token 时的密钥不同。
-
Token 格式不正确
- JWT 本身需要满足
header.payload.signature
三段结构,如果缺失或被篡改,就会解析失败。
- JWT 本身需要满足
-
Token 为空或传错
- 可能传入的
token
值是null
或者没有带上前端传过来的 Token。
- 可能传入的
-
Token 已过期
- JWT 在生成时一般会设置
exp
(过期时间),过了这个时间再去解析就会报错。
- JWT 在生成时一般会设置
三、排查过程
-
确认密钥配置
查看application.yml
,确认配置的adminSecretKey
与生成 Token 的一致。没问题。
-
打印 Token
在解析前打印token
,检查格式。发现格式正确,并且 header 和 payload 都能正常解码。 -
token过期问题
搜索之后怀疑:Token 已经过期(Expired)。
四、最终原因
问题的根源在于 Token 已经过期。
JWT 的过期时间(exp
)一旦超出,就无法再被解析,需要用户重新获取新的 Token。
五、解决办法
-
开发环境:手动重新生成一个新的 Token,替换掉过期的 Token;或者重新登录一下,在F12里面找到网络,点击login的预览从中取出token,即可正常解析。
-
生产环境:
- 在用户登录时生成 Token,并返回给前端。
- 前端请求时带上 Token。
- 如果 Token 过期,后端应返回 401 状态码,前端可以引导用户重新登录或者通过 刷新 Token(Refresh Token) 机制获取新的 Token。
六、经验总结
-
遇到 JWT 解析失败,第一时间要想到 是否过期。
-
排查思路可以按照:
- 密钥是否一致
- Token 格式是否正确
- Token 是否为空
- Token 是否过期
-
在实际开发中,可以通过 刷新 Token 或 延长过期时间 来改善用户体验。