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 | 196 +++++++++++++++++++++++++++++++++--------------- 1 files changed, 135 insertions(+), 61 deletions(-) diff --git a/seller/src/libs/axios.js b/seller/src/libs/axios.js index 768708e..a56faf8 100644 --- a/seller/src/libs/axios.js +++ b/seller/src/libs/axios.js @@ -17,10 +17,57 @@ : BASE.API_PROD.common; // 鏂囦欢涓婁紶鎺ュ彛 export const uploadFile = commonUrl + "/common/common/upload/file"; -var isRefreshToken = 0; -const refreshToken = getTokenDebounce(); -const service = axios.create({ +export const uploadFile2 = commonUrl + "/common/lmk/file/upload"; + +// 浣跨敤鐘舵�佹爣璁版浛浠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 @@ -46,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); } @@ -104,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); @@ -133,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"); @@ -227,6 +255,18 @@ responseType: "blob" }; return service(data); +}; + +export const postRequest2 = (url, params, headers) => { + let accessToken = getStore("accessToken"); + return service({ + method: "post", + url, + data: params, // 鐩存帴浼犲璞★紝涓嶈鐢� [params] 鍖呰 + headers: { + "Content-Type": "application/json", + }, + }); }; export const postRequest = (url, params, headers) => { @@ -316,6 +356,17 @@ } }); }; +export const putRequest2 = (url, params, headers) => { + let accessToken = getStore("accessToken"); + return service({ + method: "put", + url, + data: params, // 鐩存帴浼犲璞★紝涓嶈鐢� [params] 鍖呰 + headers: { + "Content-Type": "application/json", + }, + }); +}; export const putRequestWithNoForm = (url, params) => { let accessToken = getStore("accessToken"); @@ -368,6 +419,29 @@ }); }; +export const uploadFileRequest2 = (url, params) => { + let accessToken = getStore("accessToken"); + return axios({ // 鐩存帴浣跨敤 axios锛岃�屼笉鏄� service锛堥伩鍏� baseUrl 褰卞搷锛� + method: "post", + url: `${url}`, // 鐩存帴浼犲畬鏁� URL锛屽 uploadFile + data: params, + headers: { + accessToken: accessToken, + 'Content-Type': 'multipart/form-data' + } + }); +}; + +export const delFileByFileKeyRequest = (url, params) => { + let accessToken = getStore("accessToken"); + return axios({ // 鐩存帴浣跨敤 axios锛岃�屼笉鏄� service锛堥伩鍏� baseUrl 褰卞搷锛� + method: "DELETE", + url: `${url}` + '/'+params, // 鐩存帴浼犲畬鏁� URL锛屽 uploadFile + headers: { + accessToken: accessToken, + } + }); +}; /** -- Gitblit v1.8.0