修复个人中心问题

This commit is contained in:
hero920103 committed 2026-09-29 18:25:09 +08:00
1 parent 0dc5c2f075
commit ca4220f92c
44 files changed
+1793 -310

No files matched your search

+11 -11
View File
@@ -51,27 +51,27 @@ service.interceptors.response.use(
const bizMsg = error.response.data?.msg || error.response.data?.message;
switch (error.response.status) {
case 401: {
// 每个请求最多用新令牌重放一次,避免「401 → 刷新 → 仍 401」反复刷新
if (error.config?._tokenRetried) {
return Promise.reject(new Error(bizMsg || 'token无效,请重新登录'));
}
// 并发场景下,本请求可能带的是「旧令牌」,而别的请求已经把令牌换成新的
// 阶段一:并发场景下,本请求可能带的是「旧令牌」,而别的请求已经把令牌换成新的
// (登录回跳、另一请求的静默续期都会改 localStorage)。
// 此时直接用最新令牌重放即可,既省掉一次刷新,也不会误报登录失效。
// 此时直接用最新令牌重放,免得白跑一次续期。
const latestToken = localStorage.getItem('token') || '';
const sentToken = String(error.config?.headers?.Authorization || '').replace(/^Bearer\s+/i, '');
if (latestToken && latestToken !== sentToken) {
if (!error.config?._replayedWithLatest && latestToken && latestToken !== sentToken) {
console.warn('[auth] 请求携带的令牌已过期,改用最新令牌重放:', error.config?.url);
error.config.headers['Authorization'] = `Bearer ${latestToken}`;
error.config._tokenRetried = true;
error.config._replayedWithLatest = true;
return service.request(error.config);
}
// 统一认证:先用 refresh_token 静默换取新令牌并重放原请求,
// 刷新失败(令牌过期/被吊销/旧本地登录遗留 token)才真正登出。
// 阶段二:仍 401 → 用 refresh_token 静默续期后重放一次。
// 注意「重放」与「续期」是两个独立阶段:前者不消耗 refresh_token,
// 只挡一次;否则令牌真的过期时就永远等不到续期,只会一路报「无效的token」。
if (error.config?._refreshed) {
return Promise.reject(new Error(bizMsg || 'token无效,请重新登录'));
}
try {
const newToken = await refreshAccessToken();
error.config.headers['Authorization'] = `Bearer ${newToken}`;
error.config._tokenRetried = true;
error.config._refreshed = true;
return service.request(error.config);
} catch (e) {
// 续期失败:清空登录态并跳认证中心重新登录(只跳一次,避免死循环)