diff --git a/src/api/auth.ts b/src/api/auth.ts index 2f96fce..12cd8bb 100644 --- a/src/api/auth.ts +++ b/src/api/auth.ts @@ -15,6 +15,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 @@ -46,6 +48,21 @@ export function clearPersistedAuth() { window.localStorage.removeItem(USER_INFO_KEY) } +export function clearAdminLoginRedirectMark() { + window.sessionStorage.removeItem(LOGIN_REDIRECT_MARK_KEY) +} + +export function shouldSkipRepeatedAdminLoginRedirect() { + const redirectAt = Number( + window.sessionStorage.getItem(LOGIN_REDIRECT_MARK_KEY), + ) + + return ( + Number.isFinite(redirectAt) && + Date.now() - redirectAt < LOGIN_REDIRECT_COOLDOWN + ) +} + export function persistAuthData({ accessCodes, accessToken, @@ -80,6 +97,7 @@ export function 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 224daad..7f4050e 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -1,9 +1,11 @@ import axios, { type AxiosRequestConfig } from 'axios' import { + clearAdminLoginRedirectMark, clearPersistedAuth, getStoredAccessToken, redirectToAdminLogin, refreshPersistedAuth, + shouldSkipRepeatedAdminLoginRedirect, } from './auth' export type ApiResponse = { @@ -85,6 +87,7 @@ async function retryRequestWithFreshToken(config?: AuthRetryConfig) { function redirectAfterAuthExpired() { clearPersistedAuth() + if (shouldSkipRepeatedAdminLoginRedirect()) return redirectToAdminLogin() } @@ -106,6 +109,7 @@ request.interceptors.response.use( return Promise.reject(new Error(data.msg || '请求失败')) } + clearAdminLoginRedirectMark() return data.data as any }, async (error) => {