Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

跨域 iframe 的 localStorage 不靠谱

  由于业务上要用到跨域的 localStorage,于是自己使用 IFRAME 的方案造了个跨域的 localStorage 的轮子。本来觉得这个方案已经这么古老,不会有什么坑的吧?正当我陶醉在古老的魔法中时,Safari 之类的坑货浏览器自带的奇葩安全设置把我从梦里敲醒了。
  我真的很讨厌 Safari,之前遇到过的一坨 BUG 都是 Safari Only 的。果粉也不要喷我,我只是发泄一下自己的愤恨而已。
  之前 Safari 在隐私模式下 localStorage 访问抛出异常的坑折腾得我心中的伤还没愈合,现在这个跨域 IFRAME 无法存储 localStorage 的坑又给我脆弱的小心脏狠狠地划了一道。下面是稳定重现:
  首先需要两个测试用的域名,比如这里我把 1.test 和 2.test 作为两个测试域名指向 127.0.0.1 # /etc/hosts
127.0.0.1 1.test 2.test
  然后是两个测试文件 test.html 和 iframe.html <!-- test.html -->
<iframe src="//2.test/iframe.html"></iframe>
<!-- iframe.html -->
<script>
var i = localStorage.getItem('i') || '0';
console.log(i);
i++;
localStorage.setItem('i', i);
</script>
  然后在 Safari 上跑就要呵呵了。虽然 localStorage 确实可以存储,但每个页面都被当做一个沙盒,同时开多个页面也是单独计数,不会共享数据。而且关掉页面后重现打开又是一个新的 localStorage。
  这算是 Safari 的特性呢还是 BUG 呢?反正我不能接受这么蛋疼的设定。这个问题我无法解决,最终只能将需要共享的数据转到服务器存储。或者我更想放弃对它的兼容。
网名:
54.198.108.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^