From b8be56fe7c3b38bb21cc36a245e2b86cb2ce3e0d Mon Sep 17 00:00:00 2001 From: peng <peng.com> Date: 星期二, 02 九月 2025 11:27:05 +0800 Subject: [PATCH] 解决访问不稳定的问题 --- manager/src/libs/axios.js | 116 ++++++++++++++++++++++++++++++++------------------------- 1 files changed, 65 insertions(+), 51 deletions(-) diff --git a/manager/src/libs/axios.js b/manager/src/libs/axios.js index be90be5..f1f2832 100644 --- a/manager/src/libs/axios.js +++ b/manager/src/libs/axios.js @@ -21,15 +21,19 @@ const service = axios.create({ timeout: 8000, - baseURL: managerUrl, - headers: { - accessToken: getStore("accessToken") - }, + baseURL: managerUrl + // 绉婚櫎鍥哄畾鐨刟ccessToken璁剧疆锛屾敼鍦ㄨ姹傛嫤鎴櫒涓姩鎬佽缃� }); var isRefreshToken = 0; const refreshToken = getTokenDebounce(); service.interceptors.request.use( config => { + // 鍔ㄦ�佽缃產ccessToken + const accessToken = getStore("accessToken"); + if (accessToken) { + config.headers.accessToken = accessToken; + } + if (config.method == "get") { config.params = { _t: Date.parse(new Date()) / 1000, @@ -101,24 +105,34 @@ } else if (error.response.status === 404) { // 閬垮厤鍒锋柊token鎶ラ敊 } else if (error.response.status === 403 || error.response.data.code === 20004) { - isRefreshToken++; - if (isRefreshToken === 1) { + // 鏀硅繘鐨則oken鍒锋柊鏈哄埗锛岄伩鍏嶇珵鎬佹潯浠� + if (isRefreshToken === 0) { + 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); - } else { - router.go(0); - } + // 鍒锋柊token鎴愬姛锛岄噸鏂板彂璧疯姹� + error.response.config.headers.accessToken = getStore("accessToken"); + isRefreshToken = 0; + return service(error.response.config); } else { + // 鍒锋柊澶辫触锛岃烦杞埌鐧诲綍椤� + isRefreshToken = 0; Cookies.set("userInfoManager", ""); + setStore("accessToken", ""); + setStore("refreshToken", ""); router.push("/login"); } - isRefreshToken = 0; + } else { + // 濡傛灉宸茬粡鏈夎姹傚湪鍒锋柊token锛岀瓑寰呬竴灏忔鏃堕棿鍚庨噸璇� + await new Promise(resolve => setTimeout(resolve, 100)); + if (isRefreshToken === 0) { + // token鍒锋柊瀹屾垚锛岄噸鏂板彂璧疯姹� + error.response.config.headers.accessToken = getStore("accessToken"); + return service(error.response.config); + } else { + // 瓒呮椂鎴栧叾浠栭敊璇紝璺宠浆鍒扮櫥褰曢〉 + router.push("/login"); + } } } else { // 鍏朵粬閿欒澶勭悊 @@ -133,46 +147,46 @@ // 鍘熷鐨刟xios鏆撮湶鍑哄幓鐢ㄥ嵆鍙� export default service -// 闃叉姈闂寘鏉ヤ竴娉� +// 鏀硅繘鐨勯槻鎶栨満鍒� function getTokenDebounce() { let lock = false; let success = false; + let resolveCallbacks = []; // 瀛樺偍绛夊緟鐨勫洖璋� + 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); // 杞鏃堕棿闂撮殧 + if (!lock) { + lock = true; + resolveCallbacks = [resolve]; // 鍒濆鍖栧洖璋冩暟缁� + + let oldRefreshToken = getStore("refreshToken"); + handleRefreshToken(oldRefreshToken) + .then(res => { + if (res.success) { + let { accessToken, refreshToken } = res.result; + setStore("accessToken", accessToken); + setStore("refreshToken", refreshToken); + success = true; + } else { + success = false; + router.push("/login"); + } + }) + .catch(err => { + console.error('Token鍒锋柊澶辫触:', err); + success = false; + }) + .finally(() => { + lock = false; + // 鍚屾椂瑙e喅鎵�鏈夌瓑寰呯殑Promise + const result = success ? "success" : "fail"; + resolveCallbacks.forEach(callback => callback(result)); + resolveCallbacks = []; + }); + } else { + // 濡傛灉姝e湪鍒锋柊锛屽皢鍥炶皟鍔犲叆绛夊緟闃熷垪 + resolveCallbacks.push(resolve); + } }); }; } -- Gitblit v1.8.0