Commit e5f37885ffb32d04d244f0ef39ac660dda6b71e1
1 parent
d7b84c78
fix: multi windows token sharing
修复同时打开多个窗口时令牌没能同步共享的问题 fixed: #761
Showing
6 changed files
with
44 additions
and
4 deletions
CHANGELOG.zh_CN.md
mock/sys/user.ts
... | ... | @@ -95,4 +95,18 @@ export default [ |
95 | 95 | return resultSuccess(codeList); |
96 | 96 | }, |
97 | 97 | }, |
98 | + { | |
99 | + url: '/basic-api/logout', | |
100 | + timeout: 200, | |
101 | + method: 'get', | |
102 | + response: (request: requestParams) => { | |
103 | + const token = getRequestToken(request); | |
104 | + if (!token) return resultError('Invalid token'); | |
105 | + const checkUser = createFakeUserList().find((item) => item.token === token); | |
106 | + if (!checkUser) { | |
107 | + return resultError('Invalid token!'); | |
108 | + } | |
109 | + return resultSuccess(undefined, { message: 'Token has been destroyed' }); | |
110 | + }, | |
111 | + }, | |
98 | 112 | ] as MockMethod[]; | ... | ... |
src/api/sys/user.ts
... | ... | @@ -5,6 +5,7 @@ import { ErrorMessageMode } from '/#/axios'; |
5 | 5 | |
6 | 6 | enum Api { |
7 | 7 | Login = '/login', |
8 | + Logout = '/logout', | |
8 | 9 | GetUserInfo = '/getUserInfo', |
9 | 10 | GetPermCode = '/getPermCode', |
10 | 11 | } |
... | ... | @@ -34,3 +35,7 @@ export function getUserInfo() { |
34 | 35 | export function getPermCode() { |
35 | 36 | return defHttp.get<string[]>({ url: Api.GetPermCode }); |
36 | 37 | } |
38 | + | |
39 | +export function doLogout() { | |
40 | + return defHttp.get({ url: Api.Logout }); | |
41 | +} | ... | ... |
src/store/modules/user.ts
... | ... | @@ -7,7 +7,7 @@ import { PageEnum } from '/@/enums/pageEnum'; |
7 | 7 | import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum'; |
8 | 8 | import { getAuthCache, setAuthCache } from '/@/utils/auth'; |
9 | 9 | import { GetUserInfoModel, LoginParams } from '/@/api/sys/model/userModel'; |
10 | -import { getUserInfo, loginApi } from '/@/api/sys/user'; | |
10 | +import { doLogout, getUserInfo, loginApi } from '/@/api/sys/user'; | |
11 | 11 | import { useI18n } from '/@/hooks/web/useI18n'; |
12 | 12 | import { useMessage } from '/@/hooks/web/useMessage'; |
13 | 13 | import { router } from '/@/router'; |
... | ... | @@ -105,7 +105,14 @@ export const useUserStore = defineStore({ |
105 | 105 | /** |
106 | 106 | * @description: logout |
107 | 107 | */ |
108 | - logout(goLogin = false) { | |
108 | + async logout(goLogin = false) { | |
109 | + try { | |
110 | + await doLogout(); | |
111 | + } catch { | |
112 | + console.log('注销Token失败'); | |
113 | + } | |
114 | + this.setToken(undefined); | |
115 | + this.setSessionTimeout(false); | |
109 | 116 | goLogin && router.push(PageEnum.BASE_LOGIN); |
110 | 117 | }, |
111 | 118 | ... | ... |
src/utils/auth/index.ts
... | ... | @@ -19,3 +19,8 @@ export function setAuthCache(key: BasicKeys, value) { |
19 | 19 | const fn = isLocal ? Persistent.setLocal : Persistent.setSession; |
20 | 20 | return fn(key, value, true); |
21 | 21 | } |
22 | + | |
23 | +export function clearAuthCache(immediate = true) { | |
24 | + const fn = isLocal ? Persistent.clearLocal : Persistent.clearSession; | |
25 | + return fn(immediate); | |
26 | +} | ... | ... |
src/utils/cache/persistent.ts
... | ... | @@ -16,6 +16,7 @@ import { |
16 | 16 | } from '/@/enums/cacheEnum'; |
17 | 17 | import { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting'; |
18 | 18 | import { toRaw } from 'vue'; |
19 | +import { pick } from 'lodash-es'; | |
19 | 20 | |
20 | 21 | interface BasicStore { |
21 | 22 | [TOKEN_KEY]: string | number | null | undefined; |
... | ... | @@ -96,8 +97,15 @@ export class Persistent { |
96 | 97 | } |
97 | 98 | |
98 | 99 | window.addEventListener('beforeunload', function () { |
99 | - ls.set(APP_LOCAL_CACHE_KEY, localMemory.getCache); | |
100 | - ss.set(APP_SESSION_CACHE_KEY, sessionMemory.getCache); | |
100 | + // TOKEN_KEY 在登录或注销时已经写入到storage了,此处为了解决同时打开多个窗口时token不同步的问题 | |
101 | + ls.set(APP_LOCAL_CACHE_KEY, { | |
102 | + ...localMemory.getCache, | |
103 | + ...pick(ls.get(APP_LOCAL_CACHE_KEY), [TOKEN_KEY, USER_INFO_KEY]), | |
104 | + }); | |
105 | + ss.set(APP_SESSION_CACHE_KEY, { | |
106 | + ...sessionMemory.getCache, | |
107 | + ...pick(sessionMemory.getCache, [TOKEN_KEY, USER_INFO_KEY]), | |
108 | + }); | |
101 | 109 | }); |
102 | 110 | |
103 | 111 | function storageChange(e: any) { | ... | ... |