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