当前位置: 首页 > news >正文

vue无感刷新Token并重新请求

vue 拦截器拦截401重新请求Token 无感刷新Token 之后重新请求报401的接口

instance.interceptors.response.use(async (response) => {let { data } = response;if (data.code === 401 || data.code === 403) {return await handleExpiredToken(response.config);}if (data.code !== 200) {return Promise.reject(data);} else {return Promise.resolve(data);}},async (error) => {if (!error || !error.response) {handleNetworkError();return Promise.reject('Network anomaly');}switch (error.response.status) {case 401:case 403:return await handleExpiredToken(error.config);case 500:handleServerError(error.response.data.code);break;case 502:Message.error('Server error');break;default:break;}return Promise.reject(error.response.data.message);}
);let isRefreshing = false;
let pendingRequests = [];/// 处理 Token 过期
const handleExpiredToken = async (originalRequest) => {if (isRefreshing) {// 如果正在刷新 Token,将请求推入队列等待return new Promise((resolve, reject) => {pendingRequests.push({ originalRequest, resolve, reject });});}isRefreshing = true; // 标记为正在刷新// 请求新的 tokentry {const params = {refreshToken: localStorage.getItem('refreshToken'),grantType: 'refreshToken'};// 刷新Token接口const response = await login(params);const { accessToken, refreshToken } = response.data;localStorage.setItem('token', accessToken);localStorage.setItem('refreshToken', refreshToken);// 处理通过原请求重试其他待处理请求processPendingRequests(accessToken);// 更新原请求的 Authorization 头originalRequest.headers['Authorization'] = `Bearer ${accessToken}`;// 重新发送原请求return await instance(originalRequest);} catch (error) {console.log('error--------', error);localStorage.clear();router.push('/login');// 清空待处理请求队列processPendingRequests(null);} finally {isRefreshing = false; // 清理标记}
}// 处理待处理请求
const processPendingRequests = (accessToken) => {pendingRequests.forEach(({ originalRequest, resolve, reject }) => {if (accessToken) {// 更新请求的头部originalRequest.headers['Authorization'] = `Bearer ${accessToken}`;resolve(instance(originalRequest));} else {reject('Token refresh failed');}});// 清空队列pendingRequests = [];
};
http://www.lryc.cn/news/444049.html

相关文章:

  • C++和OpenGL实现3D游戏编程【连载10】——纹理的半透明显示
  • 50页PPT麦肯锡精益运营转型五步法
  • Fyne ( go跨平台GUI )中文文档-小部件 (五)
  • GUI编程19:贪吃蛇小游戏及GUI总结
  • linux StarRocks 安装
  • 解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列
  • 【解决】chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标
  • 使用python操作数据库
  • [Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
  • 排序----数据结构
  • Crack道路裂缝检测数据集——目标检测数据集
  • 10.3拉普拉斯金字塔
  • redis为什么不使用一致性hash
  • Vue.js与Flask/Django后端配合
  • ESP32 入门笔记02: ESP32-C3 系列( 芯片ESP32-C3FN4) (ESP-IDF + VSCode)
  • Vue主题色实现
  • ChartLlama: A Multimodal LLM for Chart Understanding and Generation论文阅读
  • ByteCinema(1):用户的登录注册
  • 电力电网电线变电站输电线绝缘子无人机类数据集/农业植物病虫害类数据集/光伏板/工程煤矿矿场类数据集/道路类数据集
  • 深度学习之表示学习 - 引言篇
  • Linux驱动开发 ——架构体系
  • Django一分钟:lookupAPI详解,使用django orm生成高效的WHERE子句
  • 信息安全工程师(8)网络新安全目标与功能
  • 返利机器人在电商返利系统中的负载均衡实现
  • MATLAB中typecast函数用法
  • 植物大战僵尸【源代码分享+核心思路讲解】
  • 变压器设备漏油数据集 voc txt
  • 算法练习题25——leetcode3279统计重新排列后包含另一个字符串的子字符串的数目(滑动窗口 双指针 哈希)
  • JavaEE: 深入探索TCP网络编程的奇妙世界(二)
  • GPT1-GPT3论文理解