Vue项目实现token无感刷新的示例代码

 更新时间:2023年07月21日 08:43:39   作者:fuGUI  
最近在使用系统的过程中,业务人员反馈刚登录一会就提示token过期需要重新登录,所以本文为大家分享一个无感刷新的实现代码,需要的可以参考下

背景

最近在使用系统的过程中,业务人员反馈刚登录一会就提示token过期需要重新登录,这样体验很不友好,他们想要把过期时间设置长一点,不想频繁去登陆。

思考

如果token时间设置的太长,会有安全的问题;如果可以检测到token过期,然后请求新的token替换过期的token,再去请求接口,这样token过期,做到用户无感知。

实现

检测token过期可以主动和被动的去处理,简单来说,主动判断就是在token过期前就处理,被动的就是token过期后再去处理。
以下从用三个方法来实现token的无感刷新。

1.通过返回过期字段判断

通过token认证接口返回的过期字段判断,然后本地时间进行对比,如果过期就重新获取token,这个也有缺点,如果本地时间不准确,会存在判断失误问题。

2.通过定时刷新获取token

写个全局定时器,定时刷新token。这个方法显然不好,不建议使用。

3.通过axios响应拦截器中拦截

判断token 返回过期后,调用刷新token接口

实现:

// 创建 axios 实例
const request = axios.create({
  // API 请求的默认前缀
  baseURL: baseUrl,
  withCredentials: true,
  timeout: 30000 // 请求超时时间
})
// 此处是为了为了防止多次刷新token,可以通过一个变量isRefreshing 去控制是否在刷新token的状态。
let isRefreshing = false // 是否正在刷新的标记
此次为了解决同时发起两个或两个以上的请求时,过期如何处理
let requests = [] // 重试队列
// 异常拦截处理器
const errorHandler = error => {
  if (error.response) {
   //token过期状态码
    if (error.response.status === 401) {
      if (!isRefreshing) {
        // 正在刷新,执行else里面的逻辑
        isRefreshing = true
        return store.dispatch('RefreshToken',store.state.user.refresh_token).then(res => {
//获取新的token,这里的逻辑自行处理,access_token和refresh_token都需要替换保存
          error.config.headers.Authorization = 'Bearer ' + res.access_token
           // token 请求成功后将数组的方法重新执行
          requests.forEach((cb) => cb(res.access_token))
          requests = [] // 重新请求完清空
          return request(error.config)
        }).catch(() => {
          // 如果刷新的refresh_token也过期了,重新登录
          notification.error({
            message: 'token过期',
            description: '请重新登录'
          })
          if (token) {
            store.dispatch('Logout').then(() => {
              window.location.reload()
            })
          }
        }).finally(() => {
          isRefreshing = false
        })
      } else {
        // 返回未执行 resolve 的 Promise
        return new Promise(resolve => {
          // 用函数形式将 resolve 存入,等待刷新后再执行
          requests.push(token => {
            error.config.headers.Authorization = 'Bearer ' + token
            resolve(request(error.config))
          })
        })
      }
    }
  }
  return Promise.reject(error)
}

request.interceptors.response.use(response => {
 //......
}, errorHandler)

到此这篇关于Vue项目实现token无感刷新的示例代码的文章就介绍到这了,更多相关Vue token无感刷新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue中引入第三方JS库的四种方式

    Vue中引入第三方JS库的四种方式

    在开发Vue项目的时候,有时需要使用一些非ES6格式的没有export的js库,下面这篇文章主要给大家介绍了关于Vue中引入第三方JS库的详细步骤,需要的朋友可以参考下
    2022-04-04
  • Vue中map()的用法案例

    Vue中map()的用法案例

    map()函数定义在JS的array中,它返回一个新的数组,下面这篇文章主要给大家介绍了关于Vue中map()的用法案例,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 深入理解vue中slot与slot-scope的具体使用

    深入理解vue中slot与slot-scope的具体使用

    这篇文章主要介绍了深入理解vue中slot与slot-scope的具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • vue-autoui自匹配webapi的UI控件的实现

    vue-autoui自匹配webapi的UI控件的实现

    这篇文章主要介绍了vue-autoui自匹配webapi的UI控件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Vue中v-on的基础用法、参数传递和修饰符的示例详解

    Vue中v-on的基础用法、参数传递和修饰符的示例详解

    使用v-on:click给button绑定监听事件以及回调函数,@是v-on:的缩写,也就是简写也可以使用@click,这篇文章主要介绍了Vue中v-on的基础用法、参数传递和修饰符,需要的朋友可以参考下
    2022-08-08
  • vue中使用echarts的示例

    vue中使用echarts的示例

    这篇文章主要介绍了vue中使用echarts的步骤,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2021-01-01
  • vue中使用h5 video标签实现弹窗播放本地视频的方法

    vue中使用h5 video标签实现弹窗播放本地视频的方法

    本文主要介绍了vue中使用h5 video标签实现弹窗播放本地视频的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 详解如何在Vue项目中实现累加动画

    详解如何在Vue项目中实现累加动画

    这篇文章主要为大家详细介绍了如何在你的Vue项目中实现累加动画,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • Vue中使用import进行路由懒加载的原理分析

    Vue中使用import进行路由懒加载的原理分析

    这篇文章主要介绍了Vue中使用import进行路由懒加载的原理分析。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue常用6种数据加密方式的使用

    vue常用6种数据加密方式的使用

    本文介绍了在Vue.js项目中常用的6种数据加密方式,包括Base64编码、MD5哈希、SHA-256哈希、AES加密、RSA加密和使用WebCryptoAPI,每种加密方式都有其优缺点,适用于不同的场景,感兴趣的可以了解一下
    2024-10-10

最新评论