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)才拿得到新令牌