From d983fb0cccbbd710abd6255a45721047111ee255 Mon Sep 17 00:00:00 2001 From: yang <84700872+yangToT@users.noreply.github.com> Date: Tue, 10 Feb 2026 15:44:09 +0800 Subject: [PATCH] Update http.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题描述 前端在遇到 401 未授权时会执行 window.location.reload(),导致页面反复刷新并持续重发请求(如 /api/v2/apps、/api/public/init-status),从而触发页面“无限刷新”的问题。 解决思路 将 401 处理改为一次性跳转到登录页(带 redirect 参数),并清理本地 token,避免重复刷新与无效请求。 --- src/api/http.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/api/http.ts b/src/api/http.ts index ec34acc..f37c460 100644 --- a/src/api/http.ts +++ b/src/api/http.ts @@ -35,11 +35,23 @@ axiosInstance.interceptors.request.use((config: InternalAxiosRequestConfig) => { return config }) +let isRedirectingToLogin = false + +const redirectToLogin = () => { + if (typeof window === 'undefined' || isRedirectingToLogin) return + const path = window.location.pathname + if (path === '/login' || path === '/init') return + isRedirectingToLogin = true + localStorage.removeItem('access_token') + const redirect = encodeURIComponent(`${path}${window.location.search}`) + window.location.replace(`/login?redirect=${redirect}`) +} + axiosInstance.interceptors.response.use( (response: AxiosResponse) => response.data, (error: AxiosError<{ message?: string }>) => { if (error.response?.status === 401) { - window.location.reload() + redirectToLogin() return Promise.reject(error) }