,,JWT 设置token过期时间无效的解决

,,JWT 设置token过期时间无效的解决

本文主要介绍了JWT设置无效令牌过期时间的解决方案,具有很好的参考价值。希望对大家有帮助。如有错误或不足之处,请不吝赐教。

目录

JWT设置令牌到期时间无效原因分析JWT令牌到期自动续订解决方案JWTtokentoken到期刷新方案

JWT 设置token过期时间无效

原因

设置timeout的顺序不对,应该调用setClaims()方法设置Claims属性。

通过调用setExpiration()方法设置超时。

Date expiresDate=新日期(system . current time millis()expire _ time);//expire_time是令牌的有效持续时间,单位为毫秒。

错误顺序示例:

JwtBuilder result=Jwts.builder()。setExpiration(date) //在setClaims之前设置超时。设置索赔(索赔)。signWith(SignatureAlgorithm。HS256,常量。base64 secret);

正确顺序示例:

JwtBuilder result=Jwts.builder()。setClaims(claims) //先调用setClaims,再调用setExpiration。setExpiration(日期)。signWith(SignatureAlgorithm。HS256,常量。base64 secret);

原因分析

//io . jsonwebtoken . impl . defaultjwtbuilder # set expiration代码

@覆盖

公共JwtBuilder setExpiration(日期到期){

if (exp!=null) {

//如果设置时间不为空,则调用ensureClaims方法。

ensureClaims()。set expiration(exp);

}否则{

如果(this.claims!=null) {

//无检查常数条件

this . claims . set expiration(exp);

}

}

还这个;

}

ensureclaims中的io . jsonwebtoken . impl . defaultjwtbuilder #代码

受保护的索赔保险索赔(){

//如果claims为null,则创建一个新的示例。这里没有问题。

if (this.claims==null) {

this . claims=new default claims();

}

归还本索赔;

}

//io . jsonwebtoken . impl . defaultjwtbuilder # set claims(io . jsonwebtoken . claims)

@覆盖

公共JwtBuilder set Claims(Claims Claims){

//直接为声明赋值,此操作覆盖先前设置的超时,

//最终构造令牌时,不设置超时

this.claims=索赔;

还这个;

}

JWT token过期自动续期解决方案

JWT

JWT代表JSON Web Token,由三部分组成:header(头,用来描述这个JWT最基本的信息,比如它的类型,签名使用的算法等。)、payload(有效载荷,存储有效信息的地方,到期时间存储在这部分)和Signature(签证,签证信息)。

token

Token是后端生成的JWT字符串值。在前端和后端的分离中,token是前端合法身份和权限访问后端接口的凭证。

token过期刷新方案

1、单点登录

当用户登录时,后端在成功验证用户后生成两个令牌。这两个令牌分别是access_token(接入接口使用的令牌)和refresh_token(access_token过期后用于续订的令牌,请注意设置refresh _ token的过期时间比access _ token长)。后端将用户信息和这两个令牌存储在redis中,并返回给前端。

前端获取成功登录返回的两个令牌后,将其存储在localStorage中。

2、接口请求

封装前端统一接口请求函数和令牌刷新函数,请求成功后检查返回结果。如果令牌过期,调用令牌刷新函数来请求新令牌。

后端收到令牌刷新请求后,结合redis中存储的用户信息、令牌和refresh_token对请求参数进行验证,生成新的令牌和refresh_token存储在redis中返回给前端。至此,令牌刷新完成。

3、多请求应对

所谓多请求,就是短时间内同时发生多个请求。如果此时令牌已经过期,所有这些请求都将出现令牌过期请求失败。

为了避免重复刷新令牌,您需要设置令牌刷新开关isRefresh。当请求中的令牌过期时,此时将调用令牌刷新函数。同时关闭开关,将isRefresh的值设置为false,避免后续请求调用令牌刷新函数。

当发现令牌过期时,我们将推迟请求,直到令牌被刷新,然后重新执行请求。这里采用了Promise函数,每个令牌过期的请求都存储在一个Promise函数集中。令牌刷新后,打开开关将isRefresh的值设置为true,然后批量执行Promise函数集中的Promise函数,返回请求结果。

以上个人经历,希望能给大家一个参考,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: