【问题标题】:sessionStorage in iframeiframe 中的会话存储
【发布时间】:2015-11-21 18:17:41
【问题描述】:

我将在我的页面上有几个 iframe,并且我将在其中非常密集地使用 sessionStorage。我很好奇的是我是否会有单独的存储空间或一个为所有 iframe 共享的存储空间?尺寸限制如何应用?

【问题讨论】:

  • 本地存储是每个域的。来自一个域的所有页面都可以存储和访问相同的数据。 所以这肯定会在帧之间共享本地存储数据(假设它们来自同一个域)。会话存储是每个浏览器选项卡或窗口的,所以我猜它使用单独的存储,因为我总是认为框架是完全不同的窗口。这是关于浏览器/框架安全性的有趣且相关的阅读:stackoverflow.com/questions/2569768/…
  • @mikeecb 我不需要本地存储。我需要会话存储。我猜也一样,但我希望有人肯定知道。

标签: javascript iframe session-storage


【解决方案1】:

是否共享 sessionStorage 取决于 iframe 的页面及其来源,即 URL 的域部分。如果您有一个位于http://myserver/test.html 的网页,并且它通过 iframe 包含 http://thatserver/some.html,则 iframe 的页面具有域 thatserver。因此来源不同,并且 sessionStorage 不会被共享。但如果 iframe 的页面是 http://myserver/some.html,它具有相同的来源,因此将共享相同的会话存储。

现在还有一个技巧:iframe 的sandbox 属性。如果你写的<iframe sandbox> 没有allow-same-origin 的值,则iframe 的内容将获得一个唯一 来源。这意味着无论该页面的真实来源如何,它都会获得不同的 sessionStorage。您可以写<iframe sandbox="allow-same-origin"> 将内容沙箱化,并让 iframe 的内容具有相同的来源(但前提是确实具有相同的来源)。

现在特别注意:沙盒 iframe 将不支持 localStorage per spec。而在 webkit-browsers 和 mozilla firefox 中,如果沙盒 iframe 内容将尝试访问 sessionStorage,则会引发异常。

【讨论】:

    【解决方案2】:

    好的,我自己做了一个测试。至少在 Chrome (44) 和 Firefox (40) 中,sessionStorage 在页面和 iframe 之间共享,如果它们属于同一域,则如果它们属于不同域,则不会。

    【讨论】:

    • 就我而言,它仅在私人导航模式下触发异常(chrome 84)
    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多