Vue中token刷新及续期的功能实现

2023-11-03

在vue中如何实现token续期(刷新token)

原因

最近公司项目有一个视频播放的功能,然后由于在测试环境登录时token过期时间较短导致一直在当前页面播放视频会出现token过期的现象,然后用户刷新会触发axios响应拦截器的操作退出系统。所以需要解决这个token过期的问题 ,以便在token过期前通过接口刷新token,让过期时间延长。

思路

那有了这个需求,就要说说解决思路了,一般来说,我们登陆成功的时候会通过账号密码来调用一个获取token的接口,此接口内会有token的过期时间以及一个refreshToken标识,该refreshToken则是用来刷新token的标识,然后呢我们可以通过判断token的过期时间与我们当前时间的差值来动态刷新,比如我们公司是过期之前半个小时来发送刷新token的请求。

解决方法

那思路有了就开始撸码呗,这个刷新token的请求放在哪里合适呢?然后发这个请求的时候会不会阻断页面的其他请求等等这些问题还需要咱们思考。本来我刚开始是准备放到router.beforeEach里面,每次刷新页面的时候判断时间差,但是这样的话属于看运气,没到时间的话不会发请求,而超出时间的话则会一刷新就退出系统。。。而且由于是视频播放一般也会停留许久,所以我就把请求放在axios的请求拦截器里了,每此法请求时判断时效性,播放视频时是采用轮训的方式发送播放记录,也刻意即时响应,nice!

好了 接下来放代码 各位刻意酌情参考

首先我们先获取到token和过期时间以及当前时间
/* 被挂起的请求数组 */
let refreshSubscribers = []

let isRefreshing = false // 是否有请求正在刷新token

/* push所有请求到数组中 */
function subscribeTokenRefresh(cb) {
  refreshSubscribers.push(cb)
}

/* 刷新请求(refreshSubscribers数组中的请求得到新的token之后会自执行,用新的token去请求数据) */
function onRrefreshed(token) {
  refreshSubscribers.map(cb => cb(token))
}

const token = localStorage.getItem('token')
const t = new Date().getTime() // 当前时间
const tokenExpTime = localStorage.getItem('tokenExpTime') // 过期时间
接下来判断token是否存在,因为在登录时是不需要token的,登录成功之后的接口才需要token,然后判断过期时间是否大于当前时间,是的话直接退出,否则判断是否在半小时内(我设的过期时间是半小时),是的话就挂起其他请求(可能你在刷新页面的时候token时效已经在半小时内,此时页面内有很多接口同时发起请求,则需要把这些请求挂起,只调用刷新token的请求),subscribeTokenRefresh方法则是这个作用,当发送完refreshToken的请求后,此时则把挂起的请求取出重新调用,onRrefreshed此方法则是起该作用,调用结束后,token就续期成功啦!!!
 if (token) {
    config.headers['Authorization'] = 'Bearer ' + token
    if (tokenExpTime) {
      // 已经过期 直接退出
      if (tokenExpTime < t) {
        store.dispatch('FedLogOut').then(() => {
          router.push({ path: '/' })
        })
        // 判断token是否快到期 过期前半小时刷新  30 * 60 * 60 * 1000 
      } else if (tokenExpTime - 10 * 60 * 1000 < t && config.url.indexOf('refreshTokenAPI') === -1) {
        // 是否在刷新
        if (!isRefreshing) {
          isRefreshing = true
          const params = {
            refreshToken: store.getters.refreshToken
          }
          // 刷新token
          store.dispatch('refresh', params).then(res => {
            isRefreshing = false
            window.localStorage.setItem('tokenExpTime', new Date().getTime() + res.expiresIn * 1000)
            onRrefreshed(token)
            refreshSubscribers = []
            return
          }).catch(() => {
            store.dispatch('FedLogOut').then(() => {
              router.push({ path: '/' })
            })
          })
        }
        const retry = new Promise((resolve, reject) => {
          /* (token) => {...}这个函数就是回调函数*/
          subscribeTokenRefresh((token) => {
            config.headers.Authorization = 'Bearer ' + token
            /* 将请求挂起*/
            resolve(config)
          })
        })
        return retry
      } else {
        return config
      }
    }
  } else {
    return config
  }
把新的过期时间存在本地继续同当前时间对比,每次到你设置的过期时间前则继续上述操作。

__以上就是我总结的如何在vue中刷新token的操作,若有更好的解决方法也希望可以互相讨论哈,喜欢的可以点赞,感谢 __

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue中token刷新及续期的功能实现 的相关文章

随机推荐

  • Jacoco代码覆盖率测试

    欢迎光临我的博客查看最新文章 https river106 cn 1 简介 JaCoCo Java Code Coverage 是一个开源的覆盖率工具 它针对的开发语言是java 其使用方法很灵活 可以嵌入到Ant Maven中 很多第三方
  • linux下nginx重启命令

    linux下的nginx重启命令常见以下3种 systemctl restart nginx service nginx restart usr sbin nginx s reload
  • 高职教育应对ChatGPT应用的策略

    一 完善顶层设计 提升技术水平 在推广ChatGPT平台的过程中 高职院校需要关注技术本身的问题 这就需要在国家和地方政府的引导下 引入更完善的技术顶层设计 提高人工智能在高职教育中的运用水平 具体来说 一方面需要出台更加高效的法规来确保我
  • Flink CDC 单线程读取 mysql binlog 同步到 Elasticsearch 的压力测试

    硬件环境 MySQL 服务器2核1G Flink 服务器2核4G Elasticsearch 服务器2核8G 软件版本 MySQL 5 7 35 Flink 2 12 1 14 2 Elasticsearch 7 1 0 flink sql
  • Github上传代码菜鸟超详细教程

    最近需要将课设代码上传到Github上 之前只是用来fork别人的代码 这篇文章写得是windows下的使用方法 第一步 创建Github新账户 第二步 新建仓库 第三部 填写名称 简介 可选 勾选Initialize this repos
  • 二分法(二)找到目标值开始位置和结束位置NUSOJ2677

    题目 现在给定一个升序排列的数组num t个目标值 现在你要做的便是找到目标值在数组中的开始位置和结束位置 如果数组中不存在该值 则返回 1 1 输入m Input 第一行输入一个n n 1 lt n lt 1e6 代表数组num长度 第二
  • 如何搭建一个完整的Vue3.0 + ts 的项目

    如何搭建一个完整的Vue3 0 ts 的项目 相信9月18日尤大大的关于Vue3 0的发表演讲大家一定有所关注 现在Vue3 0 也已经进入RC阶段 最终产品的候选版本 如果没有问题则可发布成为正式版本 所以Vue3 0的学习是我们必然的趋
  • matlab无人机路径规划,一种新的优化算法,天牛群算法,比蚁群算法效果好,收敛快

    matlab无人机路径规划 一种新的优化算法 天牛群算法 比蚁群算法效果好 收敛快 在tsp qap二次规划以及三维路径规划上有很好的效果 ID 51100647321750445tbNick id4mr
  • CSDN周赛58期后记,及往期题目记录

    本期周赛没什么bug 体验比较丝滑 提出表扬 咱也不能老吐槽不是 当然 丝滑的根本原因是题目比较水 尤其是最后一道 莫名其妙的键盘 两周前的 56 期刚刚考过 当真是莫名其妙而又迫不及待地又考了一遍 是怕大家背得不够熟吗 而从难度上看 这道
  • go语言安装环境

    go语言安装环境 1 安装包下载 2 安装 最好不要有中文路径 3 测试环境 cmd中输入 go version 回车 4 经典代码 保存文件名 hello go package main import fmt 包含println func
  • c++拆分string型字符串存到vector中

    对数据进行拆分放到vec中 void split string const std string str std vector
  • 关于IDEA无法启动常见的几个问题

    IDEA无法启动 常见的问题及解决办法 第一种 无法启动 大多是因为javaagent 那一行 这种比较简单 出现这种问题 大都是因为编辑vmoptions时出错造成的 这种只需要删除idea 的配置文件就行 一般默认在C盘 例如 C Us
  • Python requests“Max retries exceeded with url” error

    今天写python网络爬虫的时候遇到一个问题 报错的具体内容如下 HTTPConnectionPool host dds cr usgs gov port 80 Max retries exceeded with url ltaauth s
  • 机器学习——朴素贝叶斯、后验概率最大和极大似然

    朴素贝叶斯没有参数估计 给堆数据直接求 属于生成模型 不用优化模型求最佳参数 这区别于判别模型 我遇到的困惑 1 后验概率最大 和 极大似然 这二者有什么区别和联系吗 2 朴素贝叶斯和EM这二者有什么区别和联系吗 答案 1 朴素贝叶斯是根据
  • 怎么维护自己的电脑?

    方向一 我的电脑介绍 我使用的是一台来自知名品牌的笔记本电脑 它具有高性能的核心配置 如快速处理器 大容量内存和高性能显卡 以及宽敞的存储空间 我选择这台电脑主要是因为它的出色性能和可靠性 能够满足我在学习和工作中的需求 方向二 我的日常维
  • 数据分析Power BI数据建模教程(四)——如何创建计算度量值和计算表

    Power BI 是基于云的商业数据分析和共享工具 它能帮您把复杂的数据转化成最简洁的视图 通过它 您可以快速创建丰富的可视化交互式报告 即使在外也能用手机端 APP 随时查看 甚至检测公司各项业务的运行状况 只需它仪表板的一个界面就够了
  • 使用yum安装nginx,几步完成,超级简单!(亲测)

    1 安装yum utils工具包 sudo yum install yum utils 2 设置yum存储库 进入 etc yum repos d目录 cd etc yum repos d 创建nginx repo文件 vim nginx
  • AMIS + httplib 快速搭建前后端

    AMIS httplib 快速搭建前后端 1 简介 1 1 AMIS简介 1 2 httplib开源库 2 快速使用 2 1 AMIS环境搭建 2 2 创建一个登陆页面 2 3 利用httplib搭建简单的后端 2 4 运行 尾声总结 1
  • 基于python手动画出spectrogram(语谱图)

    Spectrogram是基于STFT变换得到的 非常有助于分析信号的时频特性 在语音信号处理中常被称为 语谱图 python中有一些写好的模块可以直接将时域的信号转化成spectrogram 但这并不利于对其原理的理解 而且横纵左边的转换也
  • Vue中token刷新及续期的功能实现

    在vue中如何实现token续期 刷新token 原因 最近公司项目有一个视频播放的功能 然后由于在测试环境登录时token过期时间较短导致一直在当前页面播放视频会出现token过期的现象 然后用户刷新会触发axios响应拦截器的操作退出系