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

相关文章

  • vant Cascader级联选择实现可以选择任意一层级

    vant Cascader级联选择实现可以选择任意一层级

    这篇文章主要介绍了vant Cascader级联选择实现可以选择任意一层级方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Vue内部渲染视图的方法

    Vue内部渲染视图的方法

    这篇文章主要介绍了Vue内部渲染视图的方法,本文通过实例代码图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 基于Vue SEO的四种方案(小结)

    基于Vue SEO的四种方案(小结)

    这篇文章主要介绍了基于Vue SEO的四种方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • vue实现路由不变的情况下,刷新页面操作示例

    vue实现路由不变的情况下,刷新页面操作示例

    这篇文章主要介绍了vue实现路由不变的情况下,刷新页面操作,结合实例形式分析了vue路由不变的情况下刷新页面具体原理、操作方法与相关注意事项,需要的朋友可以参考下
    2020-02-02
  • Vue POST请求头'Content-Type':'application/json;',data上传过程

    Vue POST请求头'Content-Type':'application/j

    这篇文章主要介绍了Vue POST请求头'Content-Type':'application/json;',data上传过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 在Flask项目中集成并访问Vue前端项目的流程步骤

    在Flask项目中集成并访问Vue前端项目的流程步骤

    在现代 Web 开发中,前后端分离的架构模式越来越流行,前端通常使用 Vue、React 等框架开发,而后端则使用 Flask、Django 等框架提供 API 服务,本文将详细介绍如何在一个 Flask 项目中集成 Vue 前端项目,并确保能够正确访问和运行,需要的朋友可以参考下
    2025-03-03
  • vue.js获得当前元素的文字信息方法

    vue.js获得当前元素的文字信息方法

    下面小编就为大家分享一篇vue.js获得当前元素的文字信息方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • vue如何循环请求一个接口

    vue如何循环请求一个接口

    这篇文章主要介绍了vue如何循环请求一个接口问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • vue跳转页面的几种常用方法实例总结

    vue跳转页面的几种常用方法实例总结

    Vue是一种流行的JavaScript框架,用于构建用户界面,在Vue中,页面跳转通常使用路由(Router)来实现,除此之外还有很多方法,这篇文章主要给大家介绍了关于vue跳转页面的几种常用方法,需要的朋友可以参考下
    2024-05-05
  • vue单向数据流的深入理解

    vue单向数据流的深入理解

    随着前端的项目的越来越复杂,出现了一堆概念来降低开发的复杂性,单向数据流就是其中一个,下面这篇文章主要给大家介绍了关于vue单向数据流的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01

最新评论