Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在同一来源上为iFrame创建单独的会话存储_Javascript_Iframe_Browser_Local Storage_Session Storage - Fatal编程技术网

Javascript 如何在同一来源上为iFrame创建单独的会话存储

Javascript 如何在同一来源上为iFrame创建单独的会话存储,javascript,iframe,browser,local-storage,session-storage,Javascript,Iframe,Browser,Local Storage,Session Storage,标准W3C标准介绍了localStorages: 不同的作者共享一个主机名,例如在geocities.com上托管内容的用户,都共享一个本地存储对象。没有按路径名限制访问的功能。因此,建议共享主机上的作者避免使用这些功能,因为其他作者读取数据并覆盖数据是很简单的 但对于会话存储,据说它确实为选项卡和窗口提供了单独的会话存储,即使来自同一来源 但iFrame似乎确实共享了会话存储 是否有一种方法可以在同一来源上通过iFrame进行单独的会话存储 编辑: 由于选项卡/窗口是否有单独的会话存储存在混淆

标准W3C标准介绍了localStorages:

不同的作者共享一个主机名,例如在
geocities.com
上托管内容的用户,都共享一个本地存储对象。没有按路径名限制访问的功能。因此,建议共享主机上的作者避免使用这些功能,因为其他作者读取数据并覆盖数据是很简单的

但对于会话存储,据说它确实为选项卡和窗口提供了单独的会话存储,即使来自同一来源

但iFrame似乎确实共享了会话存储

是否有一种方法可以在同一来源上通过iFrame进行单独的会话存储

编辑: 由于选项卡/窗口是否有单独的会话存储存在混淆,因此下面是一个示例页面。将代码保存在文件中,并使用两个不同的选项卡打开它。然后刷新一个选项卡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>

sessionStorage.setItem(“计数器”),(parseInt(sessionStorage.getItem(“计数器”),10)| | 0)+1);
document.getElementById(“结果”).innerHTML=sessionStorage.getItem(“计数器”);
Edit2:到目前为止,我尝试使用iframe
sandbox
属性。但是我在iframe中出现了一个错误,我根本不能使用sessionStorage。我不得不添加
sandbox=“允许相同来源”
。但是,会话存储在所有iFrame中都是相同的

提前感谢。

表示正确

存储容器设置为源域,iFrame从 同一原点共享同一对象,即使iFrame打开一个新的 会议

解决方案当前似乎不存在

<!DOCTYPE html>
<html>
<body>
    <iframe name="one" src="sessionStorageTest.html"></iframe>
    <iframe name="two" src="sessionStorageTest1.html"></iframe>
</body>
</html>


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>

sessionStorage.setItem(“计数器”),(parseInt(sessionStorage.getItem(“计数器”),10)| | 0)+1);
document.getElementById(“结果”).innerHTML=sessionStorage.getItem(“计数器”);

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>

var i=0;
而(++i<10){
sessionStorage.setItem(“计数器”),(parseInt(sessionStorage.getItem(“计数器”),10)| | 0)+1);
document.getElementById(“结果”).innerHTML=sessionStorage.getItem(“计数器”);
}

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

iFrame
创建不同的
sessionStorage
的目的和预期结果是什么?
sessionStorage
localStorage
之间的唯一区别是过期时间。两者都是特定于源的,这意味着来自同一源的页面,无论如何打开,都共享同一存储对象。如果要分离,请使用带键的对象,并在存储之前对其进行字符串化。@McK“这些页面不应使用彼此的存储。”目前,
iframe
中的
js
能够访问其他
iframe
会话存储
?@adeneo不相信jsidle允许设置
存储
,至少在这里;logged
Uncaught SecurityError:无法从“窗口”读取“localStorage”属性:拒绝访问此文档。
;plnkr允许设置
存储
项。不完全确定问题的预期结果是什么?为什么
sessionStorage
用于
iframes
?@McK将其中一个
sessionStorage
键更改为
“counter1”
?我在问题中已经说明了iframes的实现方式。正确的答案是说没有解决办法。请更新您的答案以反映这一点好吗?提前感谢。完整性+1。那很有趣。我不知道。不幸的是,这在我们当前的环境中是不可能的,因为我们被迫在所有的站点上使用tls。