1、不同浏览器无法共享localStorage和sessionStorage的值。
2、相同浏览器下,并且是同源窗口(协议、域名、端口一致),不同页面可以共享localStorage值,通过跳转的页面可以共享sessionStorage值。
3、关于sessionStorage,通常说sessionStorage关闭页面即消失,但是通过跳转的页面可以共享sessionStorage值,跳转有多种方式:
最初的时候误认为只要是同一网站下所有页面共享sessionStorage,后来发现事情不是这样的。页面是否共享sesstionStorage与打开方式有关系:通过点击链接或window.open打开的新标签页与当前页面是同一个session;其它方式单独新开页面,会初始化一个新的session,即使同一网站下,他们也不属于同一个session。
譬如同一网站下有A、B两个页面,AB页面中均添加key为detail的sesstionStorage(A页面:sesstionStorage.setItem(“detail”, “A”),B页面:sesstionStorage.setItem(“detail”, “B”)),A页面中点击链接打开的新标签与A页面享有同样的session,detail值均为A;B页面中点击链接打开的新标签与B页面享有同样的session,detail值均为B。AB页面中的session互不干扰。
在新的页面打开一个tag粘贴上一个页面的地址时不能正常跳转,直接跳转到了login页面。
百度发现是因为sessionStorage和localStorage存储周期不同:
此处参考官方文档JavaScript 存储对象 | 菜鸟教程
和以下博客localstorage和sessionstorage的区别 - 付杰博客、sessionStorage和localStorage有什么区别_火兰的博客-CSDN博客_localstorage和sessionstorage的区别
当我们作比较正规或者较大的项目时,最好不要用localStorage,毕竟通过某些方法是可以将存放的token转化为字符串信息的。那就需要解决sessionStorage不能在页面之间共享信息的问题了,原理主要参考以下文章:
html5——sessionStorage不能跨标签页解决方案-奇奇笔记
思路:
实现:
实现过程中会发现一个问题:监听storage事件未执行完就已经判断了登录信息。于是便想到是不是异步的问题,那么就要让这个函数完成之后再进行login。
此处参考:
sessionStorage不能跨标签页解决方案--vue项目_拷贝程序猿的博客-CSDN博客_sessionstorage不同标签页
sessionStorage共享(监听storage事件)_MINO吖的博客-CSDN博客_sessionstorage事件
我的实现方法:
在需要判断login的地方调用
ps:
假设 A 页面是含有sessionStorage的页面,B 页面是复制地址在新标签页打开的页面,此时b页面不存在原页面的sessionStorage(sessionStorage特性),通过以下方法可实现共享。
下面例子是我想要在 B 页面获取 A 页面key为Auth-Code和secretKey的sessionStorage。
(function() {
const AuthCode = () => sessionStorage.getItem('Auth-Code');
const secretKey = () => sessionStorage.getItem('secretKey');
//如果B页面不存在这两个sessionStorage
if (!AuthCode() || !secretKey()) {
//就随便存一个key为getSessionStorage的localStorage,用于触发A页面的getSessionStorage目标事件
localStorage.setItem('getSessionStorage', Date.now());
};
// 目标事件
window.addEventListener('storage', function(event) {
//此时A页面获取到了B页面触发的getSessionStorage事件
if (event.key == 'getSessionStorage') {
//就把A页面的sessionStorage存入localStorage,用以触发B页面的sessionStorage事件
//触发完就立即删除这个sessionStorage
localStorage.setItem('sessionStorage', JSON.stringify({
'Auth-Code': AuthCode() ?? '',
'secretKey': secretKey() ?? ''
}));
localStorage.removeItem('sessionStorage');
//此时B页面获取到了A页面触发的sessionStorage事件(删除前)且B页面不存在这两个sessionStorage
} else if (event.key == 'sessionStorage' && !AuthCode() || !secretKey()) {
//在B页面解析A页面存入的localStorage值并写入B页面的sessionStorage中(共享完成)
var data = JSON.parse(event.newValue);
for (key in data) {
sessionStorage.setItem(key, data[key]);
}
}
});
}());
1、不同浏览器无法共享localStorage和sessionStorage的值。
2、相同浏览器下,并且是同源窗口(协议、域名、端口一致),不同页面可以共享localStorage值,通过跳转的页面可以共享sessionStorage值。
3、关于sessionStorage,通常说sessionStorage关闭页面即消失,但是通过跳转的页面可以共享sessionStorage值,跳转有多种方式:
转载于:https://www.cnblogs.com/wy90s/p/9962705.html