增加租户切换功能

This commit is contained in:
hero920103 committed 2026-09-29 15:38:00 +08:00
1 parent 1685b22e1e
commit 0dc5c2f075
8 files changed
+305 -60

No files matched your search

+18 -1
View File
@@ -50,12 +50,28 @@ service.interceptors.response.use(
// 避免页面只显示 "Request failed with status code xxx"
const bizMsg = error.response.data?.msg || error.response.data?.message;
switch (error.response.status) {
case 401:
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) {
console.warn('[auth] 请求携带的令牌已过期,改用最新令牌重放:', error.config?.url);
error.config.headers['Authorization'] = `Bearer ${latestToken}`;
error.config._tokenRetried = true;
return service.request(error.config);
}
// 统一认证:先用 refresh_token 静默换取新令牌并重放原请求,
// 刷新失败(令牌过期/被吊销/旧本地登录遗留 token)才真正登出。
try {
const newToken = await refreshAccessToken();
error.config.headers['Authorization'] = `Bearer ${newToken}`;
error.config._tokenRetried = true;
return service.request(error.config);
} catch (e) {
// 续期失败:清空登录态并跳认证中心重新登录(只跳一次,避免死循环)
@@ -70,6 +86,7 @@ service.interceptors.response.use(
}
return Promise.reject(new Error('token无效,请重新登录'));
}
}
case 404:
console.error('请求的资源不存在');
break;