Javascript 如何在同一来源上为iFrame创建单独的会话存储
标准W3C标准介绍了localStorages: 不同的作者共享一个主机名,例如在Javascript 如何在同一来源上为iFrame创建单独的会话存储,javascript,iframe,browser,local-storage,session-storage,Javascript,Iframe,Browser,Local Storage,Session Storage,标准W3C标准介绍了localStorages: 不同的作者共享一个主机名,例如在geocities.com上托管内容的用户,都共享一个本地存储对象。没有按路径名限制访问的功能。因此,建议共享主机上的作者避免使用这些功能,因为其他作者读取数据并覆盖数据是很简单的 但对于会话存储,据说它确实为选项卡和窗口提供了单独的会话存储,即使来自同一来源 但iFrame似乎确实共享了会话存储 是否有一种方法可以在同一来源上通过iFrame进行单独的会话存储 编辑: 由于选项卡/窗口是否有单独的会话存储存在混淆
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:到目前为止,我尝试使用iframesandbox
属性。但是我在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允许设置存储
,至少在这里;loggedUncaught SecurityError:无法从“窗口”读取“localStorage”属性:拒绝访问此文档。
;plnkr允许设置存储
项。不完全确定问题的预期结果是什么?为什么sessionStorage
用于iframes
?@McK将其中一个sessionStorage
键更改为“counter1”
?我在问题中已经说明了iframes的实现方式。正确的答案是说没有解决办法。请更新您的答案以反映这一点好吗?提前感谢。完整性+1。那很有趣。我不知道。不幸的是,这在我们当前的环境中是不可能的,因为我们被迫在所有的站点上使用tls。