Создание файла 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).
Дзеймсас Звирблис
2
Если ваш серверный код написан на C #, Rick Strahl предоставляет метод получения базового домена, например example.com, из домена по адресу weblog.west-wind.com/posts/2012/Apr/24/…
CAK2
К сожалению, sub.example.comне удается установить cookie для .example.comиспользования javascript
Маринос,
28

Вы хотите:

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

В соответствии с RFC 2109 , чтобы cookie был доступен для всех поддоменов, вы должны поставить .перед своим доменом.

Если задать путь = /, cookie будет доступен во всем указанном домене (иначе .example.com).

Майк Льюис
источник
FWIW - я думаю, вам нужно удалить часть «path = expires =» и установить ее на «expires =».
malonso
3
В соответствии с новым RFC 6265 больше не нужно включать .перед доменом.
Дэн
7

Вот рабочий пример:

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

Это универсальное решение, которое берет корневой домен из объекта местоположения и устанавливает файл cookie. Реверсирование происходит потому, что вы не знаете, сколько у вас поддоменов, если они есть.

Caseyjustus
источник