From 237272730588e77da4dfa6784bdfeefe5a3fa125 Mon Sep 17 00:00:00 2001 From: scout <1134087124@qq.com> Date: Sun, 7 Apr 2024 10:49:40 +0800 Subject: [PATCH] fixbug --- src/utils/request/request.js | 57 ++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/src/utils/request/request.js b/src/utils/request/request.js index b24b78e..a2fc1c8 100644 --- a/src/utils/request/request.js +++ b/src/utils/request/request.js @@ -9,6 +9,8 @@ const request = axios.create({ timeout:60 * 60 * 1000 }); let loading +let isRefreshing = false; +let refreshSubscribers = []; request.interceptors.request.use((config)=>{ if (config.loading!==false){ loading=ElLoading.service({ @@ -23,12 +25,63 @@ request.interceptors.request.use((config)=>{ request.interceptors.response.use(async (res)=>{ // 如果返回401,说明token过期,需要重新登录 if (res && res.data.code === 401) { - // 重新登录 - await router.push('/login') + return getRefreshToken(res); } loading?.close() return res.data; },()=>{ loading?.close() }); +// 获取刷新token,刷新token成功后重新请求 +const getRefreshToken = async (response) => { + if (!isRefreshing) { + isRefreshing = true; + const refreshToken = Local.get("RefreshToken"); + if (refreshToken) { + try { + const data = { refreshToken }; + const res = await fetch( + import.meta.env.VITE_APP_API_BASE_URL+"/user/refresh/token", + { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(data), + } + ); + const responseData = await res.json(); // Parse the response body as JSON + if (responseData.code === 200) { + console.log("刷新token成功"); + Local.set("token", responseData.data.Token); + Local.set("userInfo", responseData.data.AccountInfo); + Local.set("RefreshToken", responseData.data.RefreshToken); + + return Promise.resolve(request(response.config)); + } else { + // 重新登录 + await router.push('/login'); + responseData.message = responseData.message || responseData.msg; + return Promise.reject(responseData); + } + } catch (error) { + return Promise.reject(error); + } finally { + isRefreshing = false; + refreshSubscribers.forEach((callback) => callback()); + refreshSubscribers = []; + } + } else { + // 重新登录 + await router.push('/login') + return Promise.reject(response); + } + } else { + return new Promise((resolve) => { + refreshSubscribers.push(() => { + resolve(request(response.config)); + }); + }); + } + }; export default request;