peng
9 小时以前 8fde755dd2a8b2fcd99483a5b603974c9df95fe5
商家端token过期问题
1个文件已修改
147 ■■■■■ 已修改文件
seller/src/libs/axios.js 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
seller/src/libs/axios.js
@@ -20,10 +20,54 @@
export const uploadFile2 = commonUrl + "/common/lmk/file/upload";
var isRefreshToken = 0;
const refreshToken = getTokenDebounce();
const service = axios.create({
// 使用状态标记替代计数器,避免竞态条件
let isRefreshing = false;
let failedQueue = [];
const processQueue = (error, token = null) => {
  failedQueue.forEach(prom => {
    if (error) {
      prom.reject(error);
    } else {
      prom.resolve(token);
    }
  });
  failedQueue = [];
};
// 改进的token刷新防抖机制
let refreshTokenPromise = null;
const refreshToken = () => {
  if (refreshTokenPromise) {
    return refreshTokenPromise;
  }
  refreshTokenPromise = new Promise((resolve, reject) => {
    let oldRefreshToken = getStore("refreshToken");
    handleRefreshToken(oldRefreshToken)
      .then(res => {
        if (res.success) {
          let { accessToken, refreshToken } = res.result;
          setStore("accessToken", accessToken);
          setStore("refreshToken", refreshToken);
          resolve("success");
        } else {
          reject("fail");
        }
      })
      .catch(err => {
        reject("fail");
      })
      .finally(() => {
        refreshTokenPromise = null;
      });
  });
  return refreshTokenPromise;
};
const service = axios.create({
  baseURL: baseUrl
});
axios.defaults.timeout = 100000
@@ -49,10 +93,16 @@
      setStore('uuid', uuid);
    }
    // 动态获取并设置accessToken
    const accessToken = getStore("accessToken");
    if (accessToken) {
      config.headers["accessToken"] = accessToken;
    }
    config.headers["uuid"] = uuid;
    return config;
  },
  err => {
  err => {
    Message.error("请求超时");
    return Promise.resolve(err);
  }
@@ -107,25 +157,44 @@
      } else if (error.response.status === 404) {
        // 避免刷新token报错
      } else if (error.response.status === 403) {
        isRefreshToken++;
        if (isRefreshToken === 1) {
          const getTokenRes = await refreshToken();
          if (getTokenRes === "success") {
            // 刷新token
            if (isRefreshToken === 1) {
              error.response.config.headers.accessToken = getStore(
                "accessToken"
              );
              return service(error.response.config);
        // 处理403错误,进行token刷新
        const originalRequest = error.config;
        if (!isRefreshing) {
          isRefreshing = true;
          try {
            const getTokenRes = await refreshToken();
            if (getTokenRes === "success") {
              processQueue(null, getStore("accessToken"));
              // 更新请求头中的token并重新发送请求
              originalRequest.headers["accessToken"] = getStore("accessToken");
              return service(originalRequest);
            } else {
              router.go(0);
              processQueue(new Error("Token refresh failed"), null);
              Cookies.set("userInfoSeller", "");
              setStore("accessToken", "");
              redirectLogin();
            }
          } else {
          } catch (err) {
            processQueue(err, null);
            Cookies.set("userInfoSeller", "");
            setStore("accessToken", "");
            redirectLogin();
          } finally {
            isRefreshing = false;
          }
          isRefreshToken = 0;
        }
        // 如果正在刷新token,则将请求加入队列
        return new Promise((resolve, reject) => {
          failedQueue.push({ resolve, reject });
        }).then(token => {
          originalRequest.headers["accessToken"] = token;
          return service(originalRequest);
        }).catch(err => {
          return Promise.reject(err);
        });
      } else {
        // 其他错误处理
        Message.error(error.response.data.message);
@@ -136,50 +205,6 @@
    return Promise.resolve(error);
  }
);
// 防抖闭包来一波
function getTokenDebounce() {
  let lock = false;
  let success = false;
  return function() {
    if (!lock) {
      lock = true;
      let oldRefreshToken = getStore("refreshToken");
      handleRefreshToken(oldRefreshToken)
        .then(res => {
          if (res.success) {
            let { accessToken, refreshToken } = res.result;
            setStore("accessToken", accessToken);
            setStore("refreshToken", refreshToken);
            success = true;
            lock = false;
          } else {
            success = false;
            lock = false;
            // router.push('/login')
          }
        })
        .catch(err => {
          success = false;
          lock = false;
        });
    }
    return new Promise(resolve => {
      // 一直看lock,直到请求失败或者成功
      const timer = setInterval(() => {
        if (!lock) {
          clearInterval(timer);
          if (success) {
            resolve("success");
          } else {
            resolve("fail");
          }
        }
      }, 500); // 轮询时间间隔
    });
  };
}
export const getRequest = (url, params, resBlob) => {
  let accessToken = getStore("accessToken");