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多个元素的样式选择器问题

    vue多个元素的样式选择器问题

    这篇文章主要介绍了vue多个元素的样式选择器问题,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • vue3中不支持.sync语法糖的解决方法

    vue3中不支持.sync语法糖的解决方法

    在 Vue 3 中,.sync 修饰符已经被移除,在 Vue 2 中,.sync 修饰符是一个语法糖,用于简化子组件和父组件之间的双向数据绑定,那么本文将给大家介绍一下vue3中不支持.sync语法糖的解决方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • vue中使用vee-validator完成表单校验方案

    vue中使用vee-validator完成表单校验方案

    vee-validator是一种基于vue模板的轻量级校验框架。本文主要讨论的是vee-validator校验方案,感兴趣的朋友跟随小编一起看看吧
    2019-11-11
  • 详解Vue 匿名、具名和作用域插槽的使用方法

    详解Vue 匿名、具名和作用域插槽的使用方法

    这篇文章主要介绍了Vue 匿名、具名和作用域插槽的使用方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • vue实现选择商品规格功能

    vue实现选择商品规格功能

    这篇文章主要为大家详细介绍了vue实现选择商品规格功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue实现上下层叠轮播图

    Vue实现上下层叠轮播图

    这篇文章主要介绍了Vue实现上下层叠轮播图,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue实例成员 插值表达式 过滤器基础教程示例详解

    vue实例成员 插值表达式 过滤器基础教程示例详解

    这篇文章主要为大家介绍了vue实例成员 插值表达式 过滤器基础教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • vue3使用vue-cli引入windicss报错Can‘t resolve windi.css问题

    vue3使用vue-cli引入windicss报错Can‘t resolve windi.css问题

    这篇文章主要介绍了vue3使用vue-cli引入windicss报错Can‘t resolve windi.css问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Element-Plus的ClickOutside指令导致内存泄漏的解决办法

    Element-Plus的ClickOutside指令导致内存泄漏的解决办法

    这篇文章给大家介绍了Element-Plus的ClickOutside指令导致内存泄漏的解决办法,文中给出了详细的解决办法,遇到同样问题的小伙伴可以参考阅读一下本文
    2024-01-01
  • Vue父子组件通信全面详细介绍

    Vue父子组件通信全面详细介绍

    这篇文章主要介绍了React中父子组件通信详解,在父组件中,为子组件添加属性数据,即可实现父组件向子组件通信,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-10-10

最新评论