【问题标题】:Creating a JavaScript cookie on a domain and reading it across sub domains在域上创建 JavaScript cookie 并跨子域读取它
【发布时间】: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>

【问题讨论】:

    标签: javascript cookies


    【解决方案1】:

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

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

    MDN Set() Method Documentation

    【讨论】:

    • 链接失效
    • 文档好像被移动了。感谢@CodingYourLife 的提醒!
    【解决方案2】:

    这是一个工作示例:

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

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

    【讨论】:

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

    你想要:

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

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

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

    【讨论】:

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

    只需在 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 变得困难。例如,请参阅stackoverflow.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
    猜你喜欢
    • 2021-09-11
    • 2012-01-19
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多