需求:最近接到一个优化,项目在登录后,如果用户想在新的标签页中直接打开项目中的链接,无需再次登录
为了安全,项目token 都存在sessionStorage中的,关闭页面后即sessionStorage存储的数据自动清空,但是sessionStorage存储同源标签页无法共享,只有localStorage才能相互共享。
我在网上看了很多方法,最后还是采用localStorage + sessionStorage的方法相结合
思路 token仍缓存至localStorage,但是关闭最后一个标签页面后,清空localStorage
首先保证新的标签页有唯一的uuid,即时刷新也不会变化
js
this.uuid = sessionStorage.getItem('uuid') ?? ''
if (!this.uuid) {
this.uuid = String(Date.now())
setSession('uuid', this.uuid)
}
其次我会往localStorage中存一个token 和 新的数组uuids
js
localStorage.setItem('token', your token)
const uuids = localStorage.getItem('uuids') ?? JSON.stringify([])
const arr: Array<string> = JSON.parse(uuids)
if (!arr.includes(this.uuid)) {
arr.push(this.uuid)
localStorage.setItem('uuids', JSON.stringify(arr))
}
然后监听页面销毁,并在localStorage中uuids数组删除当前页面的uuid,这样就能判断同源打开了几个页面,如果当前是最后一个,就执行localStorage.clear()
js
created() {
window.addEventListener('beforeunload', this.beforeunload)
}
beforeDestroy() {
window.removeEventListener('beforeunload', this.beforeunload)
}
beforeunload() {
const uuids = getLocal('uuids')
if (uuids) {
const arr: Array<string> = JSON.parse(uuids)
const index = arr.indexOf(this.uuid)
if (index > -1) {
arr.splice(index, 1)
localStorage.setItem('uuids', JSON.stringify(arr))
if (arr.length === 0) {
localStorage.clear()
}
}
}
}