From 74757f9eb44815a5a9851463b15f006fa841406c Mon Sep 17 00:00:00 2001 From: owenchen Date: Wed, 7 Oct 2026 09:05:52 +0800 Subject: [PATCH] =?UTF-8?q?storge=E6=9C=891=E5=A4=A9=E9=81=8E=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebVue/src/store/modules/loginProfile.ts | 34 +++++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/WebVue/src/store/modules/loginProfile.ts b/WebVue/src/store/modules/loginProfile.ts index 59d08fe..d952c0c 100644 --- a/WebVue/src/store/modules/loginProfile.ts +++ b/WebVue/src/store/modules/loginProfile.ts @@ -23,17 +23,37 @@ export const useLoginProfileStore = defineStore("loginProfile", { actions: { updateLoginProfile(loginProfile: LoginProfile) { this.loginProfile = loginProfile; - storage.set(JWT_STORAGE_ID, "Bearer " + loginProfile.Token.AccessToken); - storage.set(JWT_REFRESHKEY_STORAGE_ID, loginProfile.Token.RefreshToken); - storage.set(LOGIN_PROFILE_STORAGE_ID, JSON.stringify(this.loginProfile)); + // 令牌与用户档案用 expire:null 存储(不做过期)。 + // storage 默认只缓存 1 天:第二天再打开时 getToken()/getJwtInfo() + // 会因过期直接返回 null 并删除条目,本地既没有 AccessToken 也没有 + // RefreshToken,401 拦截器无处续期、路由守卫直接跳登录页—— + // 而 RefreshToken 在后端有 60 天有效期,本可自动刷新续期。 + // 是否失效交给后端判定:刷新失败时 request.ts 会 clearStorage() 收尾。 + storage.set( + JWT_STORAGE_ID, + "Bearer " + loginProfile.Token.AccessToken, + null, + ); + storage.set( + JWT_REFRESHKEY_STORAGE_ID, + loginProfile.Token.RefreshToken, + null, + ); + storage.set( + LOGIN_PROFILE_STORAGE_ID, + JSON.stringify(this.loginProfile), + null, + ); }, updateToken(token: string) { this.loginProfile.Token.AccessToken = token; - storage.set(JWT_STORAGE_ID, token); + storage.set(JWT_STORAGE_ID, token, null); }, updateJwtInfo(jwtInfo: JwtInfo) { - storage.set(JWT_STORAGE_ID, "Bearer " + jwtInfo.AccessToken); - storage.set(JWT_REFRESHKEY_STORAGE_ID, jwtInfo.RefreshToken); + // 同 updateLoginProfile:刷新得到的新令牌同样不设本地过期时间, + // 否则续期后的令牌过一天又会被本地缓存过期删除。 + storage.set(JWT_STORAGE_ID, "Bearer " + jwtInfo.AccessToken, null); + storage.set(JWT_REFRESHKEY_STORAGE_ID, jwtInfo.RefreshToken, null); // 只改令牌,用户信息与权限清单必须沿用缓存里的原值。 // pinia 不做持久化(刷新页面后 state 会重置成 new LoginProfile()), @@ -52,7 +72,7 @@ export const useLoginProfileStore = defineStore("loginProfile", { profile.Token.AccessToken = jwtInfo.AccessToken; profile.Token.RefreshToken = jwtInfo.RefreshToken; profile.Token.CreatedTime = jwtInfo.CreatedTime; - storage.set(LOGIN_PROFILE_STORAGE_ID, JSON.stringify(profile)); + storage.set(LOGIN_PROFILE_STORAGE_ID, JSON.stringify(profile), null); } // 同步回内存:同页面后续读取(如 updateToken)才拿得到新令牌