Criar um cookie JavaScript em um domínio e lê-lo em subdomínios

101

Abaixo está um cookie JavaScript que é gravado no computador do usuário por 12 meses.

Depois de definir o cookie em nosso domínio principal, como example.com, se o usuário visitar um subdomínio como test.example.com, precisamos continuar a identificar a atividade do usuário em nosso subdomínio de "teste".

Mas com o código atual, assim que eles saem www.example.come visitam test.example.com, eles não são mais marcados como "HelloWorld".

Alguém poderia ajudar com meu código para permitir que o cookie seja lido em subdomínios?

<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>
Evan
fonte

Respostas:

209

Basta definir os atributos domaine pathem seu cookie, como:

<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>
aroth
fonte
2
Estou tentando fazer isso no localhost e não consigo alterar o caminho
Enve
7
@Enve - Os navegadores tratam os cookies localhost de maneira um pouco diferente dos outros cookies. Ou melhor, eles tratam todos os cookies de uma forma que torna difícil trabalhar com localhost . Por exemplo, consulte stackoverflow.com/questions/1134290/… . Sugiro editar o seu hostsarquivo e aliasing algo como myserver.locala 127.0.0.1. Então você pode usar isso para acessar seu servidor local (e ao definir cookies), e esperançosamente tudo deve funcionar.
aroth
3
Todos os valores de cookie que você cria e recupera devem ser valores de string. Strings podem conter caracteres que podem perturbar o armazenamento local ao tentar recuperá-los. Uma coisa que eu sugeriria é usar os métodos encodeURI()& globais decodeURI()para o nome e valor do cookie para lidar com qualquer conversão que precise ocorrer. ie document.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue).
Dzeimsas Zvirblis
2
Se o código do lado do servidor for escrito em C #, Rick Strahl fornece um método para obter o domínio base, por exemplo, exemplo.com, do domínio em weblog.west-wind.com/posts/2012/Apr/24/…
CAK2
Infelizmente, sub.example.comnão é possível definir um cookie para .example.comusar javascript
Marinos An
27

Você quer:

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

De acordo com a RFC 2109 , para ter um cookie disponível para todos os subdomínios, você deve colocar um .na frente de seu domínio.

Definir o caminho = / fará com que o cookie esteja disponível em todo o domínio especificado (também conhecido como .example.com).

Mike Lewis
fonte
FWIW - Acho que você precisa remover a parte "path = expires =" e defini-la como "expires =".
malonso
3
De acordo com o RFC 6265 mais recente , não é mais necessário incluir o .na frente do domínio.
Dan
6

Aqui está um exemplo prático:

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

Esta é uma solução genérica que obtém o domínio raiz do objeto de localização e define o cookie. A reversão ocorre porque você não sabe quantos subdomínios possui, se houver.

Caseyjustus
fonte
2

Você também pode usar o MDN JavaScript Cookie Framework e fazer:

docCookies.setItem('HelloWorld', 'HelloWorld', myDate, '/', 'example.com');
rebagliatte
fonte