| | |
| | | |
| | | 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 |
| | |
| | | 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); |
| | | } |
| | |
| | | } 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); |
| | |
| | | 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"); |