当前位置: 首页 > news >正文

授权与认证之jwt(三)刷新令牌该如何设计

接上篇讲到授权与认证之jwt(二)把令牌封装成认证对象。为什么要刷新Token的过期时间?
我们在定义JwtUtil工具类的时候,生成的Token都有过期时间。那么问题来了,假设Token过期时间为15天,用户在第14天的时候,还可以免登录正常访问系统。但是到了第15天,用户的Token过期,于是用户需要重新登录系统。Httpsession的过期时间比较优雅,默认为15分钟。如果用户连续使用系统,只要间隔时间不超过15分钟,系统就不会销毁HttpSession对象。JWT的令牌过期时间能不能做成HttpSession那样超时时间,只要用户间隔操作时间不超过15天,系统就不需要用户重新登录系统。实现这种效果的方案有两种:双Token和Token缓存,这里重点讲一下Token缓存方
案。Token缓存方案是把Token缓存到Redis,然后设置Redis.里面缓存的Token 过期时间为正
常Token的1倍然后根据情况刷新Token的过期时间。

Token失效,缓存也不存在的情况
当第15天,用户的Token失效以后,我们让Shiro程序到Redis查看是否存在缓存的Token,如
果这个Token不存在于Redis!里面,就说明用户的操作间隔了15天,需要重新登录,
Token失效,但是缓存还存在的情况
如果Redist中存在缓存的Token,说明当前Token失效后,间隔时间还没有超过15天,不应该让
用户重新登录。所以要生成新的Token返回给客户端,并且把这个Token缓存到Redis里面,这
种操作成为刷新Token过期时间。

二、客户端如何更新令牌?
在我们的方案中,服务端刷新Token过期时间,其实就是生成一个新的Token给客户端。那么
客户端怎么知道这次响应带回来的Token:是更新过的呢?这个问题很容易解决。只要用户成功登陆系统,当后端服务器更新Token的时候,就在响应中添加Token。客户端那边判断每次Ajax响应里面是否包含Token,如果包含,就把Token保存起来就可以了。

三、如何在响应中添加令牌?

我们定义OAuth2 Filter类拦截所有的HTTP请求,一方面它会把请求中的Token字符串提取出
来,封装成对象交给Shiro框架;另一方面,它会检查Token的有效性。如果Token 过期,那么
会生成新的Token,分别存储在ThreadLocalToken和Redis中。之所以要把新令牌保存到ThreadLocalToken里面,是因为要向AOP切面类传递这个新令牌。虽然OAuth2Filter中有doFilterInternal()方法,我们可以得到响应并且写入新今牌。但是这个做非常麻烦,首先我们要通过IO流读取响应中的数据,然后还要把数据解析成JSON对象,最后再放入这个新令牌。如果我们定义了AOP切向类,拦截所有Web方法返回的响应对象,然后在响应对象里面添加新合牌,这多简单。但是OAuth2Fi1ter和AOP切面类之间没有调用关系,所以我们很难把新令牌传给AOP切面类
代码如下:

@Component
public class ThreadLocalToken {
    
    private ThreadLocal local = new ThreadLocal();
    
    public void setToken(String token) {
        local.set(token);
    }
    
    public String getToken() {
        String token = (String) local.get();
        return token;
    }
    
    public void clear(){
        local.remove();
    }
}

相关文章:

  • 华为云 | 快速搭建DeepSeek推理系统
  • iOS 实现UIButton自动化点击埋点
  • 线程介绍及 Java 实现线程的三种方式
  • Python与Web3.py库:构建去中心化应用的未来
  • C++类和对象入门(二)
  • 支持IPD项目管理的9大系统,哪款工具能有效提高项目控制能力
  • 15. LangChain实战项目2——易速鲜花海报文案生成
  • 关于大型语言模型的结构修剪
  • WSBDF レクチア 定义2 引理3 wsbdf的乘子
  • 两路导播台mov素材硬盘格式化后的恢复方法
  • 【C++/数据结构】队列
  • java2025springboot面试题第一弹
  • WhiteNoise的用法
  • flutter 网络请求封装与json序列化与反序列化
  • FPGA开发,使用Deepseek V3还是R1(5):temperature设置
  • C++(四)类与对象 下
  • 特辣的海藻!7
  • 深入浅出理解编译器:前端视角
  • 477. 汉明距离总和
  • 基于RKNN的嵌入式深度学习开发(2)
  • 池州做网站公司/欧洲站fba
  • 专业建站公司报价/实时积分榜
  • 快彩网站开发/旺道智能seo系统
  • 沈阳网站建设/什么是优化
  • 型云网站建设/seo关键词排名优化品牌
  • 传奇sf 新开网站/站长工具国色天香