解决Jwt 超时后,进行解析抛出异常 ExpiredJwtException

博主在搭建Spring Cloud项目时,采用Jwt + Spring Security进行登录验证,因Jwt token特性导致失效时间无法刷新,需创建新token。结合Redis保存token值,刷新其有效时间。处理token转化取用户名时,遇到超时异常,最终通过查看parse方法源码,从ExpiredJwtException异常中获取解析数据解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近搭建了springcloud的项目,项目采取了Jwt + spring security 来进行登录验证,Jwt token 锁定用户的失效时间,但是由于 jwt token特性导致token失效时间无法刷新,所以必须新创建一个token令牌,用来代替之前已失效token。(token失效时间无法刷新的原因是由于jwt创建token是根据jwt保存的相关信息来计算的,过期时间是其中的一个计算维度,所以一旦过期时间改了,那么生成的token值也就变了。)

之后为了解决这个问题,结合了redis,将token值保存到redis中,用户操作后刷新redis的有效时间,这样如果jwt token失效了,再检查redis 中 保存token的key是否失效,如果没有失效,那么就重新创建jwt token ,失效了,就重新登录。

保存在redis中的key 是 用户名, 但是我需要把jwt token 转化后从 claims中取出 这个用户名,一开始我直接转化,进行debug的时候发现如果token超时了,jwt 没有返回转化结果, 而是直接抛出了异常,我查看JWT所有的转化方法,发现最终全部指向 parse(token) 方法。

Jwt所有的转化最终处理都是parse(claimJws)这个方法,而这个方法正是我一开始用的解析方法。

 

这下子我有点懵逼了,于是去看parse方法源码,最后看到了ExpiredJwtException 的抛出块代码,发现异常定义的构造方法中有claims这个参数,

检查claims发现,在异常之前token其实已经解析完毕,

这样也就代表着,抛出的这个异常ExpiredJwtException 中有一个参数claims 就是解析后的token,那么本次这个问题也就解决了。

catch ExpiredJwtException 异常后,直接从异常中获取解析的数据即可。

 

### 三级标题:解决 `auth0-java-jwt` 中的 `NoClassDefFoundError` 异常 在使用 `auth0-java-jwt` 库生成或解析 JWT 时,如果出现 `NoClassDefFoundError` 异常,通常表示运行时缺少某些必需的依赖类。这种问题常见于项目构建配置不完整、依赖版本冲突或运行环境未正确加载依赖库。 #### 检查 Maven 或 Gradle 依赖配置 确保项目中已正确引入 `auth0-java-jwt` 的依赖项。例如,在 `pom.xml` 文件中应包含以下内容: ```xml <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>4.4.0</version> </dependency> ``` 若使用 Gradle,则应在 `build.gradle` 中添加: ```groovy implementation 'com.auth0:java-jwt:4.4.0' ``` 上述配置可确保编译和运行时包含所有必要的类文件。若依赖版本过低或被其他依赖覆盖,可能导致部分类缺失,从而引发 `NoClassDefFoundError` 异常[^1]。 #### 避免依赖冲突 检查项目的依赖树,确认是否存在多个不同版本的 `auth0-java-jwt` 或其底层依赖(如 `jackson-databind`、`commons-codec` 等)。可以通过以下命令查看 Maven 项目的依赖结构: ```bash mvn dependency:tree ``` 若发现冲突,建议通过 `<exclusion>` 标签排除不必要的依赖版本,确保最终使用的为兼容版本。 #### 检查运行时类路径 即使构建阶段成功引入依赖,若部署环境(如应用服务器)未将依赖打包进最终的 WAR 或 JAR 包中,也会导致运行时报错。确保构建输出中包含 `auth0-java-jwt` 相关的类文件,或在部署描述符中明确指定依赖范围。 例如,在 Spring Boot 项目中,若使用 `spring-boot-maven-plugin` 打包,应确保插件配置允许将依赖打包进可执行 JAR: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> ``` #### 使用替代方案避免异常 若项目中存在难以解决的依赖冲突,可以考虑切换至其他 JWT 实现库(如 `io.jsonwebtoken`),以规避因 `auth0-java-jwt` 版本问题导致的运行时错误。相比而言,`io.jsonwebtoken` 的依赖结构更为简洁,且社区支持活跃,适合大多数 JWT 场景[^2]。 --- ### 三级标题:注意事项 - 在修复 `NoClassDefFoundError` 异常时,需区分是编译期还是运行期的问题。可通过日志或堆栈跟踪定位具体缺失的类名。 - 若异常信息中包含 `Could not initialize class`,则可能是静态初始化失败,需检查依赖版本是否匹配或是否存在安全策略限制。 - 建议定期更新依赖库至最新稳定版本,以获得更好的兼容性和安全性保障。 ---
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值