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无感刷新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue2.0在table中实现全选和反选的示例代码

    vue2.0在table中实现全选和反选的示例代码

    这篇文章主要介绍了vue2.0在table中实现全选和反选的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • vue使用pdf.js预览pdf文件的方法

    vue使用pdf.js预览pdf文件的方法

    在页面进行pdf预览的时候,由于文件不能够打印和下载很难满足客户的需求,接下来通过本文给大家介绍vue使用pdf.js来进行pdf预览,需要的朋友可以参考下
    2021-12-12
  • Vue3子组件watch无法监听父组件传递的属性值的解决方法

    Vue3子组件watch无法监听父组件传递的属性值的解决方法

    这篇文章主要介绍了Vue3子组件watch无法监听父组件传递的属性值的解决方法,文中通过代码示例讲解的讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-10-10
  • Vue实现按钮旋转和移动位置的实例代码

    Vue实现按钮旋转和移动位置的实例代码

    这篇文章主要介绍了Vue实现按钮旋转和移动位置的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • 详解如何在vue项目中使用eslint+prettier格式化代码

    详解如何在vue项目中使用eslint+prettier格式化代码

    在开发中我们需要一种能够统一团队代码风格的工具,作为强制性的规范,统一整个项目的代码风格,这篇文章主要介绍了详解如何在vue项目中使用eslint+prettier格式化代码,需要的朋友可以参考下
    2018-11-11
  • 详解iview的checkbox多选框全选时校验问题

    详解iview的checkbox多选框全选时校验问题

    这篇文章主要介绍了详解iview的checkbox多选框全选时校验问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • 一文带你搞懂Vue3中的各种ref的使用

    一文带你搞懂Vue3中的各种ref的使用

    在 Vue3 中,有许多与响应式相关的函数,例如 toRef、toRefs、isRef、unref 等等,本文将详细介绍这些函数的用法,让我们在实际开发中知道应该使用哪些 API 并能够熟练地回答面试官的相关问题
    2023-08-08
  • Vue组件传值方式(props属性,父到子,子到父,兄弟传值)

    Vue组件传值方式(props属性,父到子,子到父,兄弟传值)

    这篇文章主要介绍了Vue组件传值方式(props属性,父到子,子到父,兄弟传值),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • vue.config.js中配置Vue的路径别名的方法

    vue.config.js中配置Vue的路径别名的方法

    这篇文章主要介绍了vue.config.js中配置Vue的路径别名的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • VantUI封装自定义Tabbar路由跳转的实现

    VantUI封装自定义Tabbar路由跳转的实现

    本文主要介绍了VantUI封装自定义Tabbar路由跳转的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05

最新评论