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

最近搭建了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 异常后,直接从异常中获取解析的数据即可。

 

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值