Crear una cookie de JavaScript en un dominio y leerla en subdominios

101

A continuación se muestra una cookie de JavaScript que se escribe en la computadora del usuario durante 12 meses.

Después de configurar la cookie en nuestro dominio principal, por ejemplo example.com, si el usuario visita un subdominio como test.example.com, debemos continuar identificando la actividad del usuario en nuestro subdominio de "prueba".

Pero con el código actual, tan pronto como se van www.example.comy visitan test.example.com, ya no se marcan como "HelloWorld".

¿Alguien podría ayudarme con mi código para permitir que la cookie se lea en todos los subdominios?

<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
fuente

Respuestas:

209

Simplemente configure los atributos domainy pathen su 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
fuente
2
Estoy tratando de hacer esto en localhost y no puedo cambiar la ruta
Enve
7
@Enve: los navegadores tratan las cookies de localhost de manera un poco diferente a otras cookies. O más bien, tratan todas las cookies de una manera que dificulta el trabajo con localhost . Por ejemplo, consulte stackoverflow.com/questions/1134290/… . Sugiero la edición de su hostsarchivo y aliasing algo parecido myserver.locala 127.0.0.1. Luego, puede usar eso para acceder a su servidor local (y al configurar cookies) y, con suerte, todo debería funcionar.
aroth
3
Todos los valores de cookies que cree y recupere deben ser valores de cadena. Las cadenas pueden contener caracteres que pueden alterar el almacenamiento local al intentar recuperarlos. Una cosa que sugeriría es usar los métodos encodeURI()& globales decodeURI()para el nombre y valor de la cookie para manejar cualquier conversión que deba realizarse. es decir document.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue).
Dzeimsas Zvirblis
2
Si su código del lado del servidor está escrito en C #, Rick Strahl proporciona un método para obtener el dominio base, por ejemplo, example.com, del dominio en weblog.west-wind.com/posts/2012/Apr/24/…
CAK2
Desafortunadamente sub.example.com, no se pueden establecer cookies para .example.comusar javascript
Marinos An
27

Usted quiere:

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

Según el RFC 2109 , para tener una cookie disponible para todos los subdominios, debe colocar un. delante de su dominio.

La configuración de la ruta = / hará que la cookie esté disponible dentro de todo el dominio especificado (también conocido como .example.com).

Mike Lewis
fuente
FWIW - Creo que necesitas eliminar la pieza "path = expires =" y establecerla en "expires =".
malonso
3
Según el RFC 6265 más reciente , ya no es necesario incluir el .delante del dominio.
Dan
6

Aquí hay un ejemplo de trabajo:

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

Esta es una solución genérica que toma el dominio raíz del objeto de ubicación y establece la cookie. La reversión se debe a que no sabe cuántos subdominios tiene, si es que tiene alguno.

caseyjustus
fuente