如何在同一个来源上为iframe分别设置sessionStorage

McK*_*McK 12 javascript browser iframe session-storage local-storage

关于localStorages的标准W3C标准说:

共享一个主机名的不同作者(例如,托管内容的用户)geocities.com共享一个本地存储对象.没有功能可以通过路径名限制访问.因此,敦促共享主机上的作者避免使用这些功能,因为对其他作者来说读取数据并覆盖它是微不足道的.

但对于sessionStorages,据说它确实为标签和窗口提供了单独的sessionStorages,甚至来自同一个来源.

但似乎iframe确实共享sessionStorage.

有没有办法在同一来源的via iframe上有单独的sessionStorage.

编辑:由于标签/窗口确实有单独的sessionStorage存在混淆,这里是一个示例页面.将代码保存在文件中,然后使用两个不同的选项卡将其打开.然后刷新一个选项卡5次,刷新另一个选项卡1次.你会看到数字不同.

<!DOCTYPE html>
<html>
<body>
    <div id="result"></div>
    <script>
        sessionStorage.setItem("counter", (parseInt(sessionStorage.getItem("counter"), 10) || 0 ) + 1);
        document.getElementById("result").innerHTML = sessionStorage.getItem("counter");
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

Edit2:我到目前为止尝试使用的是iframe sandbox属性.但是我在iframe中遇到了一个错误,我根本不能使用sessionStorage.我不得不补充一下sandbox="allow-same-origin".但是,sessionStorage在所有iframe中再次相同.

提前致谢.

Bug*_*Bug 5

如果您有 ssl,则有一个解决方法。使用 https://... 访问一个文档并使用 http://... 访问另一个文档将为同一源创建单独的存储。


gue*_*314 3

@adeneo is correct when indicating

the storage container is set to the origin domain, and iframes from the same origin share the same object, even if the iFrame opens a new session

A workaround does not appear to currently exist

<!DOCTYPE html>
<html>
<body>
    <iframe name="one" src="sessionStorageTest.html"></iframe>
    <iframe name="two" src="sessionStorageTest1.html"></iframe>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

sessionStorageTest.html

<!DOCTYPE html>
<html>
<body>
    <div id="result"></div>
    <script>
        sessionStorage.setItem("counter", (parseInt(sessionStorage.getItem("counter"), 10) || 0 ) + 1);
        document.getElementById("result").innerHTML = sessionStorage.getItem("counter");
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

sessionStorageTest1.html

<!DOCTYPE html>
<html>
<body>
    <div id="result"></div>
    <script>
        var i = 0;
          while (++i < 10) {
            sessionStorage.setItem("counter", (parseInt(sessionStorage.getItem("counter"), 10) || 0 ) + 1);
            document.getElementById("result").innerHTML = sessionStorage.getItem("counter");
          }
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在 plnkr 上演示http://plnkr.co/edit/Etel4ToABM6gWOw6qAE5?p=preview