在域上创建 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 上设置 domain
和 path
属性,例如:
<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 并跨子域读取它的主要内容,如果未能解决你的问题,请参考以下文章