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

Eva*_*van 96 javascript cookies

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

在我们在主域上设置cookie之后example.com,如果用户访问子域test.example.com,我们需要继续在"test"子域中识别用户的活动.

但是使用当前的代码,一旦他们离开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>
Run Code Online (Sandbox Code Playgroud)

aro*_*oth 197

只需在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>
Run Code Online (Sandbox Code Playgroud)

  • @Enve - 浏览器对localhost cookie的处理方式与其他cookie略有不同.或者更确切地说,他们以一种使_localhost_工作困难的方式处理所有cookie.例如,请参阅http://stackoverflow.com/questions/1134290/cookies-on-localhost-with-explicit-domain.我建议编辑你的`hosts`文件,把像'myserver.local`这样的东西别名化为`127.0.0.1`.然后你可以使用它来访问你的本地服务器(以及设置cookie时),并希望一切都能正常工作. (7认同)
  • 您创建和检索的所有cookie值必须是字符串值.字符串可以包含在尝试检索本地存储时可能会扰乱本地存储的字符.我建议的一件事是使用全局`encodeURI()`和`decodeURI()`方法为cookie名称和值处理任何需要进行的转换.即`document.cookie = encodeURI(cookieName)+"="+ encodeURI(cookieValue)`. (3认同)
  • 我正在尝试在localhost中执行此操作,但无法更改路径 (2认同)
  • 如果您的服务器端代码是用C#编写的,那么Rick Strahl提供了一种从https://weblog.west-wind.com/posts/2012/Apr/24的域中获取基本域(例如example.com)的方法。 /从一个域获取一个基本域 (2认同)

Mik*_*wis 27

你要:

document.cookie = cookieName +"=" + cookieValue + ";domain=.example.com;path=/;expires=" + myDate;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 根据较新的[RFC 6265](http://tools.ietf.org/html/rfc6265),不再需要在域前包含`.`. (3认同)

小智 7

这是一个工作示例:

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

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

  • 如果存在二级域名扩展层次结构(例如 .co.in),则此操作将不起作用 (4认同)