diff --git a/src/utils/http.js b/src/utils/http.js index 78a69f7..f7774b8 100644 --- a/src/utils/http.js +++ b/src/utils/http.js @@ -3,15 +3,17 @@ import cache from "./cache" import { ElMessage } from "element-plus" import router from "@/router" import { useLoginStore } from "@/store/authentication/index" -// 创建axios实例 + const service = axios.create({ - baseURL: import.meta.env.VITE_APP_BASE_API, // 从环境变量获取基础URL - timeout: 10000, // 请求超时时间 + baseURL: import.meta.env.VITE_APP_BASE_API, + timeout: 10000, withCredentials: true }) //白名单 const excludePath = new Set(["/auth/login", "/auth/refresh"]) + +//请求拦截器 service.interceptors.request.use( (config) => { const token = cache.getItem("token") @@ -25,41 +27,47 @@ service.interceptors.request.use( } ) +//响应拦截器 service.interceptors.response.use( async (response) => { const res = response.data const loginStore = useLoginStore() - if (res.code !== 200) { - if (res.code === 401 || res.code === 403) { - try { - // 尝试刷新token - const refreshed = await loginStore.loginForRefreshToken() - if (refreshed) { - // 刷新成功,更新请求头中的accessToken并重新发送请求 - response.config.headers.Authorization = `Bearer ${loginStore.token}` - return service(response.config) - } - } catch (refreshError) { - ElMessage({ - message: "会话已过期,请重新登录!", - type: "error", - duration: 5 * 1000 - }) - cache.removeItem("token") - router.push("/login") - return Promise.reject(new Error("Refresh token failed")) - } - } else { - ElMessage({ - message: res.message || "Error", - type: "error", - duration: 5 * 1000 - }) - } - return Promise.reject(new Error(res.message || "Error")) //500会抛出该错 - } else { + + if (res.code == 200) { return res } + + //500会抛出该错 + if (res.code !== 401 && res.code !== 403) { + ElMessage.error(res.message || "Error") + } + + //res.code != 200 && res.code == 401 || res.code == 403的情况如下 + try { + // 尝试刷新token + const refreshed = await loginStore.loginForRefreshToken() + if (!refreshed) { + throw new Error("Refresh token failed") + } + // 刷新成功,更新请求头中的accessToken并重新发送请求 + const updateConfig = { + ...response.config, + headers: { + ...response.config.headers, + Authorization: `Bearer ${loginStore.token}` + } + } + return service(updateConfig) //使用新请求头重新发送原始请求 + } catch (refreshError) { + ElMessage({ + message: "会话已过期,请重新登录!", + type: "error", + duration: 5 * 1000 + }) + cache.removeItem("token") + router.push("/login") + return Promise.reject(refreshError) + } }, (error) => { ElMessage({