我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JWT设置token过期时间无效怎么解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 token过期自动续期解决方案

JWT

JWT全称JSON Web Token,由三部分组成header(头部,用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等)、payload(载荷,就是存放有效信息的地方,在这一部分中存放过期时间)和signature(签证,签证信息)。

token

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

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过期时间无效怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JWT设置token过期时间无效怎么解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JWT设置token过期时间无效怎么解决

这篇文章主要介绍了JWT设置token过期时间无效怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JWT设置token过期时间无效怎么解决文章都会有所收获,下面我们一起来看看吧。JWT 设置token过期
2023-07-02

设置session过期时间不生效怎么解决

如果设置session过期时间不生效,可能是由于以下原因:1. 服务器配置问题:检查服务器的session配置是否正确。确保session的过期时间设置正确,并且服务器支持session过期时间的功能。2. 代码逻辑问题:检查代码中是否有其
2023-08-17

redis怎么设置过期时间

redis中的过期时间自动删除超过生命周期的键,可有效缓存短暂有效期的数据。设置过期时间有两种方法:1. expire命令,设置过期时间(秒);2. pexpire命令,设置过期时间(毫秒)。可通过ttl命令查询过期时间,返回剩余过期时间(
redis怎么设置过期时间
2024-05-21

MySQL怎么设置数据过期时间

MySQL本身不支持设置数据的过期时间,但可以通过以下方法实现类似的功能:使用触发器:可以创建一个定时触发器,定期删除或更新过期的数据。使用定时任务:可以定期执行一个脚本或程序,删除或更新过期的数据。使用程序控制:在应用程序中设置数据的过期
MySQL怎么设置数据过期时间
2024-04-26

Redis怎么批量设置过期时间

这篇文章将为大家详细讲解有关Redis怎么批量设置过期时间,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis如何批量设置过期时间呢?不要说在foreach中通过set()函数批量设置过期时间我们引入
2023-06-21

Java怎么设置过期时间的map

这篇文章给大家分享的是有关Java怎么设置过期时间的map的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、技术背景在实际的项目开发中,我们经常会使用到缓存中间件(如redis、MemCache等)来帮助我们提高
2023-06-29

redis在java怎么设置过期时间

本篇文章详细介绍了在Java中使用Jedis和Lettuce库为Redis键设置过期时间的方法。过期时间的单位可以是秒、毫秒、微秒或毫微秒。过期时间可以覆盖现有过期时间,并可以近似获取键的剩余生存时间。除了上述方法,还可以使用PEXPIRE、PEXPIREAT和PXAT命令设置过期时间。
redis在java怎么设置过期时间
2024-04-02

asp中怎么设置session过期时间

在ASP中,可以通过设置Session对象的Timeout属性来设置Session的过期时间。Timeout属性表示Session的有效期,单位为分钟。例如,将Session的过期时间设置为30分钟:```Session.Timeout =
2023-08-18

Redis怎么设置键的过期时间

在Redis中,可以使用EXPIRE命令或者SET命令的EX参数来设置键的过期时间。使用EXPIRE命令:EXPIRE key seconds其中,key是要设置过期时间的键名,seconds是过期的秒数。例如,要让键mykey在60秒
Redis怎么设置键的过期时间
2024-05-07

redis怎么设置默认的过期时间

在Redis中,可以使用`EXPIRE`命令设置键的过期时间。但是,如果你想要为所有键设置一个默认的过期时间,可以使用Redis的`CONFIG`命令来修改`timeout`属性。下面是设置默认过期时间的步骤:1. 使用`CONFIG GE
2023-09-06

Springboot2 session设置超时时间无效的解决方法

本篇内容介绍了“Springboot2 session设置超时时间无效的解决方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题:今天项目
2023-06-20

springboot项目怎么设置session的过期时间

小编今天带大家了解springboot项目怎么设置session的过期时间,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“spring
2023-06-29

Ubuntu的tzselect设置时间失效怎么解决

今天小编给大家分享一下Ubuntu的tzselect设置时间失效怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。tzs
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录