本文主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。