wujie icon indicating copy to clipboard operation
wujie copied to clipboard

子应用和主应用sessionStorage隔离问题

Open tony-chooper opened this issue 10 months ago • 6 comments

1.我现在创建了主应用A,子应用B和子应用C; 2.主应用登录以后会在sessionStorage中存储一个token,供接口鉴权使用,由于应用间的token是隔离的; 3.子应用B/C登录以后也会创建token存储在sessionStorage中,这时候由于sessionStorage未被隔离,导致token被覆盖。 4.在切换子应用BC时,token不会被子应用B或者C识别,导致子应用接口调用报错, 5.子应用B、C之间其他sessionStorage中存储的同名值,也会被覆盖, 有什么好的方案解决该问题吗?

tony-chooper avatar Feb 25 '25 09:02 tony-chooper

主应用代理子应用的 sessionStorage 操作,给每个子应用 key 拼接 prefix 进行读写

Naeemo avatar Feb 25 '25 10:02 Naeemo

不知道 无界 框架是否支持 天然隔离,如果修改每个子应用的 key , 对原有应用的侵入比较大,子应用 不只集成在当前主应用内。

hpf393187274 avatar Feb 26 '25 01:02 hpf393187274

我自己通过插件的方式在主应用中代理了子应用的appWindow.sessionStorage, 通过增加前缀的方式将子应用的session隔离,不知道官方是否支持session隔离的配置?或者后续会不会支持 setupApp({ name: 'lams-admin', url: http://localhost:8531/, plugins: [ { jsBeforeLoaders: [ { content: 'console.log("js-before-loader-callbacktest")' }, // 执行一个回调,打印子应用名字 { callback(appWindow) { initProxySession(appWindow, appWindow.__WUJIE.id) }, }, ], }, ], })

具体的代理代码:------------------------------------- const isProxySessionMap = new Map() // 创建代理处理程序 export const initProxySession = (app: any, prefix: string) => { if (isProxySessionMap.get(prefix)) { return } const sessionStorageHandler = { get(target: any, propKey: any) { // 拦截 getItem 方法 if (propKey === 'getItem') { return function (key: string) { const namespacedKey = ${prefix}:${key} return Reflect.apply(target[propKey], target, [namespacedKey]) } } // 拦截 setItem 方法 if (propKey === 'setItem') { return function (key: string, value: any) { const namespacedKey = ${prefix}:${key} return Reflect.apply(target[propKey], target, [namespacedKey, value]) } } // 其他属性或方法直接透传 return target[propKey] }, }

const originalSessionStorage = app.sessionStorage const proxiedSessionStorage = new Proxy(originalSessionStorage, sessionStorageHandler) isProxySessionMap.set(prefix, true) Object.defineProperty(app, 'sessionStorage', { value: proxiedSessionStorage, writable: false, configurable: true, }) }

tony-chooper avatar Feb 27 '25 02:02 tony-chooper

主应用代理子应用的 sessionStorage 操作,给每个子应用 key 拼接 prefix 进行读写

大佬,可以贴一下代码吗? 参考学习一下,谢谢了

KiteWorld avatar Apr 08 '25 00:04 KiteWorld

主应用代理子应用的 sessionStorage 操作,给每个子应用 key 拼接 prefix 进行读写

大佬,可以贴一下代码吗? 参考学习一下,谢谢了 上边的评论就是代码,这个是代理的方法:initProxySession, 这是用法 jsBeforeLoaders: [ { content: 'console.log("js-before-loader-callbacktest")' }, // 执行一个回调,打印子应用名字 { callback(appWindow) { initProxySession(appWindow, appWindow.__WUJIE.id) }, }, ],

tony-chooper avatar Apr 09 '25 03:04 tony-chooper

子应用重写sessionStorage,加上命名空间namespace?

chewenye avatar Apr 24 '25 05:04 chewenye