Créer un cookie JavaScript sur un domaine et le lire dans les sous-domaines

101

Vous trouverez ci-dessous un cookie JavaScript qui est écrit sur l'ordinateur de l'utilisateur pendant 12 mois.

Après avoir défini le cookie sur notre domaine principal, par exemple example.com, si l'utilisateur visite un sous-domaine tel que test.example.com, nous devons continuer à identifier l'activité de l'utilisateur dans notre sous-domaine "test".

Mais avec le code actuel, dès qu'ils partent www.example.comet visitent test.example.com, ils ne sont plus marqués comme "HelloWorld".

Quelqu'un pourrait-il m'aider avec mon code pour permettre la lecture du cookie dans les sous-domaines?

<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
la source

Réponses:

209

Définissez simplement les attributs domainet pathsur votre cookie, comme:

<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
la source
2
J'essaie de le faire dans localhost et je ne peux pas changer de chemin
Enve
7
@Enve - Les navigateurs traitent les cookies localhost un peu différemment des autres cookies. Ou plutôt, ils traitent tous les cookies d'une manière qui rend le travail avec localhost difficile. Par exemple, voir stackoverflow.com/questions/1134290/… . Je suggère de modifier votre hostsfichier et aliasing quelque chose comme myserver.localà 127.0.0.1. Ensuite, vous pouvez l'utiliser pour accéder à votre serveur local (et lors de la configuration des cookies), et j'espère que tout devrait fonctionner.
aroth
3
Toutes les valeurs de cookie que vous créez et récupérez doivent être des valeurs de chaîne. Les chaînes peuvent contenir des caractères susceptibles de perturber le stockage local lorsque vous essayez de les récupérer. Une chose que je suggérerais est d'utiliser les méthodes globales encodeURI()& decodeURI()pour le nom et la valeur du cookie pour gérer toute conversion qui devrait avoir lieu. ie document.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue).
Dzeimsas Zvirblis
2
Si votre code côté serveur est écrit en C #, Rick Strahl fournit une méthode pour obtenir le domaine de base, par exemple example.com, à partir du domaine sur weblog.west-wind.com/posts/2012/Apr/24/…
CAK2
Impossible de sub.example.comdéfinir un cookie pour l' .example.comutilisation de javascript
Marinos An
27

Tu veux:

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

Conformément à la RFC 2109 , pour qu'un cookie soit disponible pour tous les sous-domaines, vous devez placer un .devant votre domaine.

En définissant le chemin = /, le cookie sera disponible dans tout le domaine spécifié (aka .example.com).

Mike Lewis
la source
FWIW - Je pense que vous devez supprimer le morceau "path = expires =" et le régler sur "expires =".
malonso du
3
Conformément à la nouvelle RFC 6265, il n'est plus nécessaire d'inclure le .devant du domaine.
Dan
6

Voici un exemple de travail:

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

Il s'agit d'une solution générique qui prend le domaine racine de l'objet de localisation et définit le cookie. L'inversion est due au fait que vous ne savez pas combien de sous-domaines vous avez, le cas échéant.

caseyjustus
la source
2

Vous pouvez également utiliser le MDN JavaScript Cookie Framework et faire:

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