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

Posted

技术标签:

【中文标题】在域上创建 JavaScript cookie 并跨子域读取它【英文标题】:Creating a JavaScript cookie on a domain and reading it across sub domains 【发布时间】:2011-08-06 00:00:08 【问题描述】:

以下是在用户计算机上写入 12 个月的 javascript cookie。

在我们的主域(如example.com)上设置cookie后,如果用户访问像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>

【问题讨论】:

【参考方案1】:

只需在 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>

【讨论】:

我正在尝试在 localhost 中执行此操作,但无法更改路径 @Enve - 浏览器对待 localhost cookie 的方式与其他 cookie 略有不同。或者更确切地说,他们处理所有 cookie 的方式使得使用 localhost 变得困难。例如,请参阅***.com/questions/1134290/…。我建议编辑您的hosts 文件并将myserver.local 之类的别名设置为127.0.0.1。然后您可以使用它来访问您的本地服务器(以及在设置 cookie 时),希望一切正常。 您创建和检索的所有 cookie 值都必须是字符串值。字符串可以包含在尝试检索它们时会扰乱本地存储的字符。我建议的一件事是使用全局 encodeURI()decodeURI() 方法作为 cookie 名称和值来处理需要进行的任何转换。即document.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue). 如果您的服务器端代码是用 C# 编写的,Rick Strahl 提供了一种获取基域的方法,例如example.com,来自域 weblog.west-wind.com/posts/2012/Apr/24/… 很遗憾,sub.example.com 无法使用 javascript 为 .example.com 设置 cookie【参考方案2】:

你想要:

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

根据RFC 2109,要让所有子域都可以使用cookie,您必须在您的域前面放置一个.

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

【讨论】:

FWIW - 我认为您需要删除 "path=expires=" 部分并将其设置为 "expires="。 根据较新的RFC 6265,不再需要在域前面包含.【参考方案3】:

这是一个工作示例:

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

这是一个通用的解决方案,它从位置对象中获取根域并设置 cookie。逆向是因为你不知道你有多少子域。

【讨论】:

如果域扩展有二级层次结构,这将不起作用,例如.co.in【参考方案4】:

您也可以使用Cookies API 并执行以下操作:

browser.cookies.set(
  url: 'example.com',
  name: 'HelloWorld',
  value: 'HelloWorld',
  expirationDate: myDate

MDN Set() Method Documentation

【讨论】:

链接失效 文档好像被移动了。感谢@CodingYourLife 的提醒!

以上是关于在域上创建 JavaScript cookie 并跨子域读取它的主要内容,如果未能解决你的问题,请参考以下文章

在域上上传后,MySql 无法识别某些表列

地理插件 API 有时无法在域上运行

如何使 PHP 服务器 websocket 在域上工作?

在域上运行 socket.io

使用 C# 在域上保留具有快照的虚拟机

使用 PHP 或 JavaScript 在多个域上设置 cookie