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

IT技术 javascript cookies
2021-02-04 21:05:38

以下是在用户计算机上写入 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>
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>
不幸的是sub.example.com,无法为.example.com使用 javascript设置 cookie
2021-03-17 21:05:38
@Enve - 浏览器对待本地 cookie 的方式与其他 cookie 略有不同。或者更确切地说,他们以一种使与localhost 合作变得困难的方式对待所有 cookie 例如,请参阅stackoverflow.com/questions/1134290/...我建议编辑您的hosts文件并myserver.local127.0.0.1. 然后您可以使用它来访问您的本地服务器(以及在设置 cookie 时),希望一切正常。
2021-03-31 21:05:38
您创建和检索的所有 cookie 值都必须是字符串值。字符串可以包含在尝试检索它们时会扰乱本地存储的字符。我建议的一件事是使用cookie 名称和值的全局encodeURI()&decodeURI()方法来处理需要发生的任何转换。document.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue)
2021-04-05 21:05:38
我正在尝试在本地主机中执行此操作,但无法更改路径
2021-04-08 21:05:38
如果您的服务器端代码是用 C# 编写的,Rick Strahl 提供了一种从weblog.west-wind.com/posts/2012/Apr/24/...
2021-04-09 21:05:38

你要:

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

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

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

FWIW - 我认为您需要删除“path=expires=”部分并将其设置为“expires=”。
2021-04-13 21:05:38
根据较新的RFC 6265,不再需要.在域前面包含
2021-04-13 21:05:38

这是一个工作示例:

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

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

如果存在域扩展的二级层次结构,例如 .co.in,这将不起作用
2021-04-01 21:05:38

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

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

MDNSet()方法文档

链接坏了
2021-03-21 21:05:38
看起来文档被移动了。感谢@CodingYourLife 的提醒!
2021-03-22 21:05:38