axios响应拦截器无法处理过期的refresh_token(401)
创始人
2024-09-29 02:30:43
0

要解决axios响应拦截器无法处理过期的refresh_token(401)的问题,可以使用以下代码示例:

// 创建axios实例
const axiosInstance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 5000
});

// 定义变量用于存储是否正在刷新token的状态
let isRefreshing = false;

// 定义变量用于存储需要重新发送的请求
let refreshSubscribers = [];

// 添加请求拦截器
axiosInstance.interceptors.request.use(
  config => {
    // 在每个请求中添加token
    const token = localStorage.getItem('access_token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 添加响应拦截器
axiosInstance.interceptors.response.use(
  response => {
    return response;
  },
  error => {
    const originalRequest = error.config;

    // 处理refresh_token过期的401错误
    if (error.response.status === 401 && !originalRequest._retry) {
      if (isRefreshing) {
        // 如果已经在刷新token,则将当前请求添加到刷新队列中
        return new Promise((resolve, reject) => {
          refreshSubscribers.push(token => {
            originalRequest.headers.Authorization = `Bearer ${token}`;
            resolve(axiosInstance(originalRequest));
          });
        });
      }

      // 设置正在刷新token的状态
      isRefreshing = true;

      // 发送刷新token的请求
      const refreshToken = localStorage.getItem('refresh_token');
      return new Promise((resolve, reject) => {
        axiosInstance
          .post('/refresh_token', { refresh_token: refreshToken })
          .then(response => {
            const { access_token } = response.data;
            // 更新本地存储的token
            localStorage.setItem('access_token', access_token);
            localStorage.setItem('refresh_token', response.data.refresh_token);
            // 更新请求的Authorization header
            originalRequest.headers.Authorization = `Bearer ${access_token}`;
            // 执行刷新队列中的请求
            resolve(axiosInstance(originalRequest));
            // 清空刷新队列
            refreshSubscribers = [];
          })
          .catch(error => {
            // 清空本地存储的token
            localStorage.removeItem('access_token');
            localStorage.removeItem('refresh_token');
            // 跳转到登录页面
            window.location.href = '/login';
            reject(error);
          })
          .finally(() => {
            // 重置刷新token的状态
            isRefreshing = false;
          });
      });
    }

    return Promise.reject(error);
  }
);

// 导出axios实例
export default axiosInstance;

在上述代码中,我们首先创建了一个axios实例axiosInstance,然后添加了请求拦截器和响应拦截器。在请求拦截器中,我们在每个请求中添加了token。在响应拦截器中,我们处理了refresh_token过期的401错误。当收到401错误时,我们首先判断是否正在刷新token,如果是,则将当前请求添加到刷新队列中;如果不是,则发送刷新token的请求,并在请求成功后更新本地存储的token,并执行刷新队列中的请求。如果刷新token请求失败,则清空本地存储的token,跳转到登录页面。

使用上述代码示例,你可以在axios中处理过期的refresh_token,并且在刷新token时不会丢失任何请求。

相关内容

热门资讯

出现新变化!福建大玩家辅助操作... 您好:福建大玩家辅助操作视频这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用...
第九分钟开挂!微信小程序微乐挖... 第九分钟开挂!微信小程序微乐挖坑辅助免费,花花生活圈可以开挂,教你教程-2026最新版本微信小程序微...
此事引发广泛关注!三哥玩摆头注... 此事引发广泛关注!三哥玩摆头注可以控制(辅助挂)其实是有挂(有挂法门)-哔哩哔哩 【无需打开直接搜索...
九分钟开挂!皮皮透视辅助软件工... 九分钟开挂!皮皮透视辅助软件工具,皇豪互众控制系统下载,分享教程-2026最新版本1、九分钟开挂!皮...
今天上午!蜀山四川辅助脚本(辅... 今天上午!蜀山四川辅助脚本(辅助挂)一直真的有挂(有挂方案)-哔哩哔哩;亲,蜀山四川辅助脚本这款游戏...
四分钟开挂!闲逸同花插件,欢聚... 四分钟开挂!闲逸同花插件,欢聚水鱼辅助视频,必备教程-2026最新版本1、欢聚水鱼辅助视频透视辅助简...
为切实保障!牌乐门安全黑科技是... 为切实保障!牌乐门安全黑科技是真的吗(辅助挂)其实真的是有挂(有挂方针)-哔哩哔哩您好:牌乐门安全黑...
五分钟开挂!约局吧辅助器下载,... 五分钟开挂!约局吧辅助器下载,兴动互娱辅助工具,介绍教程-2026最新版本1、该软件可以轻松地帮助玩...
据了解!今日长牌破解(辅助挂)... 据了解!今日长牌破解(辅助挂)原来是有挂的(有挂机巧)-哔哩哔哩 了解更多开挂安装加(1367043...
3分钟开挂!广西老友玩友破解视... 3分钟开挂!广西老友玩友破解视频,玄龙辅助工具,教你教程-2026最新版本1)广西老友玩友破解视频辅...