【问题标题】:HTML5 session storage send to serverHTML5 会话存储发送到服务器
【发布时间】:2013-05-23 10:20:14
【问题描述】:

如果我是对的,会话存储存储在客户端,并且只能通过一个选项卡访问。

如何将存储在会话存储中的信息发送到服务器?我可以使用 cookie,但如果我打开 2 个选项卡,cookie 将被第二个选项卡重写。

谢谢

【问题讨论】:

  • ajax 请求浮现在脑海。

标签: javascript html session-storage


【解决方案1】:

Storage 对象(localStorage 和 sessionStorage)可从所有打开相同页面的选项卡中获得。

但是(一些评论指出这是不正确的,但这是对文档的误解),当您打开一个新选项卡时,会在内部创建一个新的存储对象。这是第一个的克隆,因此当时的内容是相同的。

它们从那一点被分开处理,但您可以通过在您的代码中收听storage event 来同步它们。

来自http://dev.w3.org/html5/webstorage/#the-sessionstorage-attribute:(请注意,规范针对的是实施者)

当通过克隆一个新的顶级浏览上下文创建 现有的浏览上下文,新的浏览上下文必须以 与原始相同的会话存储区域,但两组必须 从那时起被认为是分开的,不会相互影响 反正。 [...] 当 setItem()、removeItem() 和 clear() 方法 在与会话关联的存储对象 x 上调用 存储区 [...],然后对于每个 Document 对象,其 Window 对象的 sessionStorage 属性的 Storage 对象与 同一个存储区,除了x,发送存储通知

也就是说,当在活动选项卡中修改存储时,storage 事件会发送到所有其他选项卡(对于同一来源) - 但不是活动选项卡,当然不需要这是正在修改的。

使用event 读取keynewValue 字段以更新当前非活动 选项卡中的localSession(还有oldValue 在事件)。 storageArea 包含受影响的存储对象(如果您同时使用本地存储和会话存储,则很有用)。

至于“一个域” - 是的,相同的数据只能用于相同的来源(方案、域和端口)。

将数据发送到服务器是完全可能的。 Storage 中存储的所有内容(会话和本地)都存储为字符串。我建议对它进行编码(JSON 是 不是 必要的,因为它已经存储为字符串)。使用 f.ex:

var dataForServer = encodeURIComponent(sessionStorage.getItem(myKey));

然后将其作为表单、url 或 ajax 的一部分发送。

【讨论】:

    【解决方案2】:

    sessionStorage 可用于 1 个域,而不是 1 个选项卡。因此,您可以在一个选项卡中的页面上设置信息,然后您可以在第二个选项卡中读出它。 对不起,我以为它是这样工作的。但事实并非如此,您需要 localStorage 或 cookie 才能使其工作。

    因此将其存储在 cookie 中是一个可行的选择,但如果您这样做,为什么还要使用 sessionStorage?

    您也可以通过 Ajax 将 sessionStorage 的内容发送到服务器,(尽管您必须将数据转换为 json,因为您只能发送字符串)

    但如果你还是在服务器上保存信息,你为什么要使用 sessionStorage? localStorage 和 sessionStorage 的全部意义在于保存服务器不必知道的用户特定信息。

    【讨论】:

    • sessionStorage 可用于 1 个域,而不是 1 个选项卡 — 不正确:请参阅 developer.mozilla.org/en-US/docs/Web/Guide/DOM/… — 这是一个全局对象 (sessionStorage),它维护一个可用于页面会话的持续时间。只要浏览器打开并在页面重新加载和恢复后仍然存在,页面会话就会持续。在新选项卡或窗口中打开页面将导致启动新会话。
    • 我的立场是正确的,我认为如果同一页面有两个或更多选项卡打开,它会使用同一个会话。我刚试过,不是这样的。
    猜你喜欢
    • 2021-11-13
    • 2016-09-02
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多