From 8fde755dd2a8b2fcd99483a5b603974c9df95fe5 Mon Sep 17 00:00:00 2001 From: peng <peng.com> Date: 星期四, 25 九月 2025 18:28:24 +0800 Subject: [PATCH] 商家端token过期问题 --- seller/src/libs/axios.js | 147 ++++++++++++++++++++++++++++-------------------- 1 files changed, 86 insertions(+), 61 deletions(-) diff --git a/seller/src/libs/axios.js b/seller/src/libs/axios.js index a3dbfdc..a56faf8 100644 --- a/seller/src/libs/axios.js +++ b/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({ +// 浣跨敤鐘舵�佹爣璁版浛浠h鏁板櫒锛岄伩鍏嶇珵鎬佹潯浠� +let isRefreshing = false; +let failedQueue = []; +const processQueue = (error, token = null) => { + failedQueue.forEach(prom => { + if (error) { + prom.reject(error); + } else { + prom.resolve(token); + } + }); + + failedQueue = []; +}; + +// 鏀硅繘鐨則oken鍒锋柊闃叉姈鏈哄埗 +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閿欒锛岃繘琛宼oken鍒锋柊 + const originalRequest = error.config; + + if (!isRefreshing) { + isRefreshing = true; + + try { + const getTokenRes = await refreshToken(); + if (getTokenRes === "success") { + processQueue(null, getStore("accessToken")); + // 鏇存柊璇锋眰澶翠腑鐨則oken骞堕噸鏂板彂閫佽姹� + 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; } + + // 濡傛灉姝e湪鍒锋柊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"); -- Gitblit v1.8.0