这篇文章主要介绍了Jwt设置token过期时间无效怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JWT设置token过期时间无效怎么解决文章都会有所收获,下面我们一起来看看吧。JWT 设置token过期
这篇文章主要介绍了Jwt设置token过期时间无效怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JWT设置token过期时间无效怎么解决文章都会有所收获,下面我们一起来看看吧。
设置超时时间的顺序有误, 应调用setClaims()方法设置claims属性。
在调用setExpiration()方法设置超时时间。
Date expiresDate = new Date(System.currentTimeMillis() + expire_time);// expire_time为token有效时长, 单位毫秒
错误顺序示例:
JwtBuilder result = Jwts.builder() .setExpiration(date) // 超时时间设置在 setClaims之前 .setClaims(claims) .signWith(SignatureAlGorithm.HS256, Constants.BASE64SECRET);
正确顺序示例:
JwtBuilder result = Jwts.builder() .setClaims(claims) // 先调用setClaims, 在调用setExpiration .setExpiration(date) .signWith(SignatureAlgorithm.HS256, Constants.BASE64SECRET);
//io.JSONWEBtoken.impl.DefaultJwtBuilder#setExpiration 中代码 @Override public JwtBuilder setExpiration(Date exp) { if (exp != null) { // 设置的时间不为空,就调用ensureClaims方法 ensureClaims().setExpiration(exp); } else { if (this.claims != null) { //noinspection ConstantConditions this.claims.setExpiration(exp); } } return this; } // io.jsonwebtoken.impl.DefaultJwtBuilder#ensureClaims 中代码 protected Claims ensureClaims() { // 如果claims为null, 则创建新的示例。 此处没有问题 if (this.claims == null) { this.claims = new DefaultClaims(); } return this.claims; } // io.jsonwebtoken.impl.DefaultJwtBuilder#setClaims(io.jsonwebtoken.Claims) 中代码 @Override public JwtBuilder setClaims(Claims claims) { // 直接给claims赋值, 这里个操作覆盖了之前设置的超时时间, // 导致最终构造token时, 没有设置超时时间 this.claims = claims; return this; }
JWT全称JSON Web Token,由三部分组成header(头部,用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等)、payload(载荷,就是存放有效信息的地方,在这一部分中存放过期时间)和signature(签证,签证信息)。
token就是后端生成的JWT字符串值,在前后端分离中,token是前端访问后端接口的合法身份、权限的凭证。
1、单点登录
用户登录,后端验证用户成功之后生成两个token,这两个token分别是access_token(访问接口使用的token)、refresh_token(access_token过期后用于刷续期的token,注意设置refresh_token的过期时间需比access_token的过期时间长),后端将用户信息和这两个token存放到redis中并返回给前端。
前端在获取到登录成功返回的两个token之后,将之存放到localStorage本地存储中。
2、接口请求
前端封装统一接口请求函数、token刷新函数,在请求成功之后对返回结果进行校验,如果token过期,则调用token刷新函数请求新的token.
后端在接收到token刷新请求之后通过结合Redis中存放的用户信息、token和refresh_token对请求参数进行验证,验证通过之后生成新的token和refresh_token存放到redis中并返回给前端。至此完成token刷新。
3、多请求应对
所谓多请求,就是指在短时间内同时发生多个请求,如果此时token已经过期,那么这些请求都会出现token过期请求失败的情况。
为了避免反复刷新token,需要设置一个刷新token的开关isRefresh,当一个请求出现token过期的时候,这个时候会调用token刷新函数,与此同时关闭开关将isRefresh的值设置为false,避免后续请求去调用token刷新函数。
当发现token过期时,咱们将请求延缓到token刷新之后再重新执行请求,这里采用Promise函数,把每一个token失效的请求都存到一个Promise函数集合里面,当token刷新之后打开开关将isRefresh的值设置为true,然后批量执行Promise函数集合里面的Promise函数,返回请求结果。
关于“JWT设置token过期时间无效怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“JWT设置token过期时间无效怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。
--结束END--
本文标题: JWT设置token过期时间无效怎么解决
本文链接: https://lsjlt.com/news/343018.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0