From ed37ca5d12416d17338f8a15fd9d5a3e2b73b518 Mon Sep 17 00:00:00 2001 From: sunlei Date: Sun, 17 May 2026 15:57:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(web):=20=E9=98=B2=E6=AD=A2=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=9B=9E=E8=B7=B3=E6=AD=BB=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/auth.ts | 13 +++++++++++++ src/api/request.ts | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/src/api/auth.ts b/src/api/auth.ts index c1867fb..61d5306 100644 --- a/src/api/auth.ts +++ b/src/api/auth.ts @@ -16,6 +16,8 @@ type PersistedAuth = { const ACCESS_TOKEN_KEY = "kt-admin-access-token"; const ACCESS_CODES_KEY = "kt-admin-access-codes"; const USER_INFO_KEY = "kt-admin-user-info"; +const LOGIN_REDIRECT_MARK_KEY = "kt-admin-login-redirect-at"; +const LOGIN_REDIRECT_COOLDOWN = 10 * 1000; let refreshPromise: Promise | null = null; let redirectingToAdminLogin = false; @@ -36,6 +38,16 @@ export const clearPersistedAuth = () => { window.localStorage.removeItem(USER_INFO_KEY); }; +export const clearAdminLoginRedirectMark = () => { + window.sessionStorage.removeItem(LOGIN_REDIRECT_MARK_KEY); +}; + +export const shouldSkipRepeatedAdminLoginRedirect = () => { + const redirectAt = Number(window.sessionStorage.getItem(LOGIN_REDIRECT_MARK_KEY)); + + return Number.isFinite(redirectAt) && Date.now() - redirectAt < LOGIN_REDIRECT_COOLDOWN; +}; + export const persistAuthData = ({ accessCodes, accessToken, @@ -70,6 +82,7 @@ export const redirectToAdminLogin = () => { if (redirectingToAdminLogin) return; redirectingToAdminLogin = true; + window.sessionStorage.setItem(LOGIN_REDIRECT_MARK_KEY, String(Date.now())); window.location.href = buildAdminLoginUrl(window.location.href); }; diff --git a/src/api/request.ts b/src/api/request.ts index ea2f2c0..e5e2a39 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -1,10 +1,12 @@ import axios, { AxiosRequestConfig } from "axios"; import config from "@/config"; import { + clearAdminLoginRedirectMark, clearPersistedAuth, getStoredAccessToken, redirectToAdminLogin, refreshPersistedAuth, + shouldSkipRepeatedAdminLoginRedirect, } from "@/api/auth"; export interface ApiResponse { @@ -76,6 +78,7 @@ const retryRequestWithFreshToken = async (requestConfig?: AuthRetryConfig) => { const redirectAfterAuthExpired = () => { clearPersistedAuth(); + if (shouldSkipRepeatedAdminLoginRedirect()) return; redirectToAdminLogin(); }; @@ -99,6 +102,7 @@ request.interceptors.response.use( return Promise.reject(new Error(getAuthErrorMessage(response.data))); } + clearAdminLoginRedirectMark(); return response.data; }, async (error) => {