7

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

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

谢谢

4

2 回答 2

13

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

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

它们与该点分开处理,但您可以通过监听代码中的 storage 事件来同步它们。

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

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

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

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

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

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

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

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

于 2013-05-28T16:10:16.337 回答
0

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

所以将它存储在 cookie 中是一个可行的选择,但如果你这样做了,你为什么还要使用 sessionStorage?

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

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

于 2013-05-28T12:44:34.223 回答