跨子域使用localStorage


95

我正在支持cookie的浏览器(IE以外的任何人)上用localStorage替换cookie 。问题是site.comwwwsite.com存储它们自己的单独的localStorage对象。我认为www被视为一个子域(如果您问我这是一个愚蠢的决定)。如果用户最初在site.com上并决定输入www。下次访问site.com时,将无法访问她的所有个人数据。如何使我的所有“子域”与主域共享相同的localStorage?


4
Firefox和IE8支持在用户指定的域下存储持久性数据。例如,在FF上,您可以执行globalStorage ['site.com'],这对于www.site.com和site.com而言是可以确定的。我仍然没有想出如何在Chrome的实现中做到这一点。
JoJo 2010年

9
考虑使用其中一种-重定向所有使用www访问的用户。子域到无子域的域,或者反之。
伊拉德·纳瓦

我很早以前就创建了一篇文章:跨域LocalStorage
jcubic,

Answers:


94

这就是我跨域使用它的方式...

  • 使用来自您的父域的iframe-说出parent.com
  • 然后在每个child.com网域上,只需将postMessage发送到您的parent.com iframe
  • 您所需要做的就是设置一个协议,该协议说明如何解释postMessage消息以与parent.com iframe对话。

希望对您有所帮助:)


2
这是真正的答案,而不是已确认的答案。我自己完成了此操作,但还使用postMessage创建了一个方便的回调包装器。
杰森·塞布林2012年

4
这是一篇很好的文章,其中包含一些解释此方法的示例代码:jcubic.wordpress.com/2014/06/20/cross-domain-localstorage
Todd Price

4
请注意,只有在未禁用第三方Cookie的情况下,这才可能实现:stackoverflow.com/a/44097269/4311428
Max

6
Apple已在台式机和移动设备上更新了Safari 7+的默认设置,以阻止第三方数据。该选项现在称为“阻止cookie和其他网站数据”,它表示诸如localstorage之类的东西,这些东西现在已完全被域隔离。此方法在Safari中不起作用
Aranganathan,

2
@Max @Aranganathan它仍然适用于原始问题案例- site.com/ www.site.com只要子域位于相同的父域上
Kostiantyn

40

如果您仅针对此特定问题使用iframe和postMessage解决方案,我认为将数据存储在无子域的Cookie中(如果尚未将其存储的话)可能会少一些(无论是代码方面还是计算方面)在有负载的localStorage中,从cookie中获取它

优点:

  • 不需要额外的iframe和postMessage设置。

缺点:

  • 将使数据可用于所有子域(不仅限于www),因此,如果您不信任所有子域,则可能对您不起作用。
  • 将根据每个请求将数据发送到服务器。不太好,但是根据您的情况,可能仍比iframe / postMessage解决方案少工作。
  • 如果这样做,为什么不直接使用Cookie?取决于您的上下文。
  • Cookie的最大大小上限为4K,该域中所有Cookie的总数总计(感谢Blake在注释中指出)

我同意其他评论者的意见,但这似乎应该是localStorage的指定选项,因此不需要变通办法。


29
骗局:最大Cookie大小为4k
Blake Miller

17
而且,正如我所学到的那样,4k限制是单个域(而不是每个cookie)的所有cookie大小的总和。
布莱克·米勒

其他缺点:-cookie更有可能被adblocker阻止-cookie用于在服务器和客户端之间共享小数据,如果服务器未使用您存储在cookie中的数据,那么这是一种滥用
Enno

32

我建议使site.com重定向到www.site.com,以保持一致性并避免此类问题。

另外,考虑使用可以使用每个浏览器本机存储的跨浏览器解决方案(如PersistJS)


我没有服务器访问权限,无法进行此类重定向。该库是否允许我在www和非www之间共享持久数据?阅读后,似乎几乎所有浏览器的存储机制都不允许这样做。无论是cookie还是localStorage,我们都将遇到这个问题……
JoJo 2010年

是的,存储通常取决于域,包括子域。这就是为什么我建议重定向。您不一定需要管理员访问权限,只需在文档根目录中使用.htaccess规则即可
Eran

1
@JoJo有几种重定向的方法,例如,通过发送标头Location,通过<meta>HTML标记甚至通过JS window.location
索尼桑托斯

1
这只是避免答案。参见Mayank的答案正确。
杰森·塞布林2012年

1
+1 @避免,这与其他情况无关-例如我在这里遇到的情况lang1.domain.com-lang2.domain.com
r --------- k

5

在主域中设置为Cookie-

document.cookie = "key=value;domain=.mydomain.com"

然后从任何主域或子域中获取数据,并将其设置在localStorage上




0

这就是我为网站解决的方法。我将所有没有www的页面重定向到了www.site.com。这样,它将始终占用www.site.com的本地存储

将以下内容添加到根目录中的.htacess中(如果尚未创建,请创建一个)

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

5
我很想拒绝这个投票,但我不会这么做,因为它可以帮助OP的使用案例,但是对于希望在myapp.com和developers.myapp.com和support.myapp.com上保持会话的人来说,这个答案是不好。
Don Omondi '17

嘿@DonOmondi如果您可以通过我的链接为您提供建议,我将不胜感激!
Ayush Baheti

3
OP询问“跨子域使用localStorage”,您的答案是“将www重定向到非www”,这是非常不同的事情,但是只有在特定子域为“ www.abc.com”(通常情况下)的情况下,它才能起作用比较实用。
Don Omondi '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.