首页 > 其他分享 >vue3 实现无感刷新token

vue3 实现无感刷新token

时间:2024-09-06 16:28:06浏览次数:11  
标签:return res vue3 response token error message 无感

问题一:如何防止多次刷新token
通过设置一个变量isRefreshing 去控制是否在刷新token的状态
if (!isRefreshing) {
isRefreshing = true
return refreshToken().then((data:any) => {
setToken(data.token_type+' '+data.access_token);
//存储token过期时换取新token值
localStorage.setItem('refresh-token',data.refresh_token)
// 刷新token成功后重新发送原来的请求
return service(response.config);
}).catch((error) => {
// 刷新token失败,跳转到登录页
// message.error(res.message)
message.error('您长时间未登录,请重新登录!')
goLogout();
return Promise.reject(error);
}).finally(()=>{
isRefreshing = false;
});
}
问题二:同时发起两个或者两个以上的请求时,其他接口怎么解决
当第二个过期的请求进来是,token正在刷新,这个时候我们可以先把这个请求存到一个数组队列中,想办法让这个请求处于等待中,一直等到刷新的token后再逐个重试清空请求队列,那么如何让这个请求处于等待中呢?我们可以借助于Promise。将请求存进队列中后,同时返回一个Promise,让这个请求一直处于等待状态,此时这个请求就会一直等,只要我们不执行resolve,这个请求就会一直在等待、当刷新请求的接口返回来后,在调用resolve,逐个重试
service.interceptors.response.use(
(response: any) => {
//console.log('封装地方的response',response)
//removePending( response.config );
const res = response.data;
// 后端status错误判断
if (response.status == 200) {
if(response.data.hasOwnProperty('code')){
if (res.code == 200) {
return Promise.resolve(res);
} else if (res.code == 401) {
if(getToken()&&!isRefreshing){
isRefreshing= true;
removeToken()
// token过期,调用刷新token的接口
return refreshToken().then((data:any) => {
setToken(data.token_type+' '+data.access_token);
//存储token过期时换取新token值
localStorage.setItem('refresh-token',data.refresh_token)
//token刷新后将数组的方法重新执行
requests.forEach((cb:any)=>cb())
requests=[]
// 刷新token成功后重新发送原来的请求
return service(response.config);
}).catch((error) => {
// 刷新token失败,跳转到登录页
// message.error(res.message)
message.error('您长时间未登录,请重新登录!')
goLogout();
return Promise.reject(error);
}).finally(()=>{
isRefreshing= false;
});
}else{
//message.error(res.message)
// 返回未执行 resolve 的 Promise
return new Promise(resolve => {
// 用函数形式将 resolve 存入,等待刷新后再执行
requests.push(() => {
resolve(service(response.config))
})
})
// goLogout()
// return Promise.reject(res);
}
}else if (res.code == 501) {
message.error(res.data)
return Promise.reject(res);
} else if (res.code == 500) {
if(!response.request.responseURL.includes('/admin/tender/token/refresh')){
message.error(res.message)
return Promise.resolve(res);
}else{
return Promise.reject(res);
}
}else {
// 错误状态码处理
message.error(res.message)
return Promise.reject(res);
}
}else{
//这里针对excel的文件流导出
return Promise.resolve(response);
}
} else {
errorMessage(response)
return Promise.reject();
}
},
(error: any) => {
// Http错误状态码处理
// return Promise.reject(error);
if (error && error.response) {
// 1.公共错误处理
// 2.根据响应码具体处理
errorMessage(error.response)
} else {
// 超时处理
if (JSON.stringify(error).includes('timeout')) {
// Message.error('服务器响应超时,请刷新当前页')
error.message = '服务器响应超时,请刷新当前页'
} else {
error.message = '连接服务器失败'
}
message.warning(error.message)
}

}

);

标签:return,res,vue3,response,token,error,message,无感
From: https://www.cnblogs.com/menglm/p/18400480

相关文章

  • vue3中computed和watch的使用
    一computd计算属性computed是Vue3中用于创建计算属性的功能。它允许你定义基于响应式数据的动态值,这些值会在其依赖的数据发生变化时自动更新。使用场景依赖于其他响应式数据的计算结果:你可以创建一个计算属性,其值依赖于其他响应式数据,并在这些数据变化时自动更新。......
  • debian11 申通 无感考勤 mysql postgresql nacos集群
     echo"nameserver114.114.114.114nameserver8.8.8.8">/etc/resolv.conf echo"debhttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdeb-srchttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdebhttps://......
  • 关于Vue2和Vue3的区别及组合式/选项式API区别——高频面试题
    1、vue2和vue3的区别以下包含但不仅仅只有这10条区别但是,在应对面试时,回答已经足够用了,这些也是vue2和vue3的主要区别CompositionAPIvsOptionsAPICompositionAPI:组合式APIOptionsAPI:选项式API——在vue2中使用它们两者在vue3中是组织代码的不同方式Vue3引入了Com......
  • vue3 tsx 测试几种使用方式
    总论tsxsetup里面定义了returndom元素,则optionsapi的render函数不生效options的render函数生效前提是setup里面不能returndomoptions的render里面可以直接使用this访问setup里面的数据或者ctxtsx一般最好用defineComponent包裹,这样响应式才能生效tsxdom语法使用{}......
  • Vue3 中的状态管理:Vuex vs Pinia 深度分析
    Vue3中的状态管理:VuexvsPinia深度分析在现代前端开发中,状态管理是一个至关重要的方面。尤其是在大型应用中,如何高效、清晰地管理状态不仅影响着代码的可读性和可维护性,还对应用的性能有直接的影响。在Vue3中,Vuex和Pinia是两种主要的状态管理库,这两者各有不同的设......
  • 在 Vue3 中使用 CSS Modules 实现样式隔离
    在Vue3中使用CSSModules实现样式隔离随着构建现代前端应用的需要,样式的管理和隔离变得越来越重要。为了解决样式冲突和管理困难的问题,CSSModules应运而生。今天,我们将讨论如何在Vue3中使用CSSModules实现样式隔离,特别是在使用新的setup语法糖的情况下。什么......
  • vue3+vite+echarts集成中国地图
    前段时间我们的项目有使用到echarts集成中国地图的功能,实际上这个功能我进项目组的时候人家就已经完成了,我这边只是简单复刻了一遍,先看看效果图;上代码,走起<template><!--第一步:设置地图容器--><divid="map"style="width:100vw;height:100vh"></div></template>......
  • 计算机毕业设计springboot+vue3便民医疗服务预约系统 原生微信小程序
    目录博主介绍技术栈开发核心技术具体实现截图前端后端java类核心代码部分展示可行性论证技术可行性详细视频演示系统测试实现思路源码获取博主介绍......
  • 这应该是全网最详细的Vue3.5版本解读kh
    合集-vue3代码修炼秘籍(16)1.答应我,在vue中不要滥用watch好吗?02-292.一文搞懂Vue3defineModel双向绑定:告别繁琐代码!02-043.没有虚拟DOM版本的vue(VueVapor)01-264.有了CompositionAPI后,有些场景或许你不需要pinia了01-235.你不知道的vue3:使用runWithContext实现在非setup期......
  • Magic推出100M个token的上下文
      每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://......