chroem 89 + 打开新标签 sessionStorage 失效

Posted 半块苹果

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了chroem 89 + 打开新标签 sessionStorage 失效相关的知识,希望对你有一定的参考价值。

前几天工作中遇到一个奇怪的问题,记录一下。

项目信息:Vue + Element UI 做的后台管理系统。

问题

使用 <a> 链接打开新标签时,页面跳转到了登录页。

原因

检查后发现新标签的 sessionStorage 是空的!由于我把 token 保存在了 sessionStorage 里面,所以当 sessionStorage 为空时直接跳转了登录页。

但是,为啥是空的??之前还好好的呀,并且,同事电脑打开项目是没问题的!

兜兜转转一下午,把问题锁定在了 chrome 的版本上,然后就搜索到了下面这一问题:

https://stackoverflow.com/questions/66473527

原来 chrome 89 版本修改了打开新标签时 sessionStorage 的处理逻辑,这其实涉及到 <a> 标签的 rel 属性,我们举例来说明一下修改前后的区别:

比方说我们从 A 标签通过 a 链接打开了一个新的 B 标签,

之前浏览器的处理逻辑:当 a 标签的 target="_blank" 时,浏览器默认会添加 rel="opener" 属性,这时 B 标签的上下文(包含 sessionStorage)是从 A 标签复制而来的,并且可以通过 window.opener来访问 A 标签的 window 对象。没错,当 B 标签不是我们自己的网站时,这时一个极其危险的行为!

现在浏览器的处理逻辑:当 a 标签的 target="_blank" 时,浏览器默认会添加 rel="noopener" 属性,这时 B 标签的上下文是一个全新的,空白的上下文,并且 B 标签不可以通过 window.opener 来访问 A 标签的 window 对象。很安全!

至此,我们捋清楚了这个问题的前因后果。

解决方案

手动的为 a 链接添加一个属性:

<a href="http://xxx" target="_blank" rel="opener">Link</a>

参考

https://stackoverflow.com/questions/66473527
a 标签的 target="__blank" 和 window.opener 可以实现恶意跳转?
Window.opener - MDN
链接类型 - MDN
当 target="_blank" 时是否要默认添加 rel="opener" 的讨论 - Github

以上是关于chroem 89 + 打开新标签 sessionStorage 失效的主要内容,如果未能解决你的问题,请参考以下文章

FireFox 如何设置成每个标签页独立的SESSION?

如何在 Firefox 89 中打开同步设备中的所有选项卡?

前一个将jsp页面能用session获取值,再打开一个新的jsp页面用session怎么获取不到??

如何在打开新标签时总是切换到新标签页?

java保存到session里,新的JSP页面怎么获取不到值

如何让新标签页打开新标签页中的网页。