在域上创建JavaScript cookie并跨子域读取它


101

下面是一个在用户计算机上编写12个月的JavaScript cookie。

在我们的主域(例如)上设置Cookie之后example.com,如果用户访问的子域(如)test.example.com,我们需要继续在“测试”子域中识别用户的活动。

但是使用当前代码,一旦他们离开www.example.com并访问test.example.com,它们就不再标记为“ HelloWorld”。

谁能帮助我的代码允许跨子域读取Cookie?

<script type="text/javascript">
  var cookieName = 'HelloWorld';
  var cookieValue = 'HelloWorld';
  var myDate = new Date();
  myDate.setMonth(myDate.getMonth() + 12);
  document.cookie = cookieName +"=" + cookieValue + ";expires=" + myDate;
</script>

Answers:


209

只需在Cookie上设置domainpath属性,例如:

<script type="text/javascript">
var cookieName = 'HelloWorld';
var cookieValue = 'HelloWorld';
var myDate = new Date();
myDate.setMonth(myDate.getMonth() + 12);
document.cookie = cookieName +"=" + cookieValue + ";expires=" + myDate 
                  + ";domain=.example.com;path=/";
</script>

2
我正在尝试在localhost中执行此操作,并且无法更改路径
Enve 2013年

7
@Enve-浏览器对待localhost cookie的方式与其他cookie有所不同。确切地说,它们以使使用localhost困难的方式对待所有cookie 。例如,请参见stackoverflow.com/questions/1134290/…。我建议编辑hosts文件和混叠像myserver.local127.0.0.1。然后,您可以使用它来访问本地服务器(以及在设置Cookie时),并希望一切正常。
aroth

3
您创建和检索的所有cookie值都必须是字符串值。字符串可以包含一些字符,这些字符在尝试检索它们时可能会破坏本地存储。我建议的一件事是对cookie名称和值使用global encodeURI()decodeURI()方法来处理需要进行的任何转换。即document.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue)
Dzeimsas Zvirblis

2
如果您的服务器端代码是用C#编写的,那么Rick Strahl提供了一种从weblog.west-wind.com/posts/2012/Apr/24/…
CAK2

不幸的是sub.example.com无法设置.example.com使用JavaScript的cookie
Marinos

27

你要:

document.cookie = cookieName +"=" + cookieValue + ";domain=.example.com;path=/;expires=" + myDate;

根据RFC 2109的规定要使 Cookie可用于所有子域,您必须.在域的前面放置一个。

设置path = /将使cookie在整个指定域(又名.example.com)内可用。


FWIW-我认为您需要删除“ path = expires =“,并将其设置为“ expires =”。
malonso 2012年

3
根据较新的RFC 6265,不再需要.在域前面包含。
2015年

6

这是一个工作示例:

document.cookie = "testCookie=cookieval; domain=." + 
location.hostname.split('.').reverse()[1] + "." + 
location.hostname.split('.').reverse()[0] + "; path=/"

这是一种通用解决方案,它从位置对象获取根域并设置cookie。反向是因为您不知道有多少个子域(如果有)。


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.