Створення файлу cookie JavaScript у домені та читання його у піддоменах


101

Нижче наведено файл cookie JavaScript, який записується на комп'ютер користувача протягом 12 місяців.

Після того, як ми встановимо файл 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>

Відповіді:


209

Просто встановіть атрибути domainта їх pathатрибути, наприклад:

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

2
Я намагаюся зробити це в localhost, і я не можу змінити шлях
Enve

7
@Enve - Браузери трактують файли cookie localhost дещо інакше, ніж інші файли cookie. А точніше, вони обробляють усі файли cookie таким чином, що ускладнює роботу з localhost . Наприклад, див stackoverflow.com/questions/1134290 / ... . Я пропоную відредагувати свій hostsфайл і myserver.localстворити щось подібне 127.0.0.1. Тоді ви можете використовувати це для доступу до свого локального сервера (і при встановленні файлів cookie), і, сподіваємось, все повинно працювати.
aroth

3
Усі створені та завантажувані файли cookie повинні бути рядковими. Рядки можуть містити символи, які можуть порушити локальне сховище при спробі їх отримання. Я б хотів би запропонувати використання глобальних encodeURI()& decodeURI()методів для ім'я та значення файлу cookie для обробки будь-якої конверсії, яка повинна відбутися. тобто document.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue).
Dzeimsas Zvirblis

2
Якщо ваш код на стороні сервера написаний на C #, Рік Страль надає метод отримання базового домену, наприклад example.com, з домену за адресою weblog.west-wind.com/posts/2012/Apr/24/…
CAK2

На жаль, sub.example.comне можна встановити файли cookie для .example.comвикористання javascript
Marinos An

27

Ти хочеш:

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

Відповідно до RFC 2109 , щоб файл cookie був доступний для всіх субдоменів, ви повинні поставити .перед вашим доменом.

Якщо встановити шлях = /, файл cookie буде доступний протягом усього вказаного домену (ака .example.com).


FWIW - я думаю, вам потрібно видалити шматок "path = expires =" і встановити його на "expires =".
malonso

3
Згідно з новими RFC 6265 більше не потрібно включати .перед домену.
Дан

6

Ось робочий приклад:

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

Це загальне рішення, яке забирає кореневий домен з об’єкта розташування та встановлює файл cookie. Повернення відбувається тому, що ви не знаєте, скільки піддоменів у вас є, якщо такі є.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.