Tworzenie pliku cookie JavaScript w domenie i odczytywanie go w subdomenach

101

Poniżej znajduje się plik cookie JavaScript, który jest zapisywany na komputerze użytkownika przez 12 miesięcy.

Po ustawieniu pliku cookie w naszej domenie głównej, na przykład w example.comprzypadku odwiedzenia przez użytkownika poddomeny, takiej jak test.example.com, musimy nadal identyfikować aktywność użytkownika w naszej „testowej” subdomenie.

Ale przy obecnym kodzie, gdy tylko opuszczą www.example.comi odwiedzą test.example.com, nie są już oznaczani jako „HelloWorld”.

Czy ktoś byłby w stanie pomóc z moim kodem, aby zezwolić na odczyt pliku cookie w subdomenach?

<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
źródło

Odpowiedzi:

209

Po prostu ustaw atrybuty domaini pathdla swojego pliku cookie, takie jak:

<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
źródło
2
Próbuję to zrobić na hoście lokalnym i nie mogę zmienić ścieżki
Enve
7
@Enve - przeglądarki traktują pliki cookie lokalnego hosta nieco inaczej niż inne pliki cookie. A raczej traktują wszystkie pliki cookie w sposób, który utrudnia pracę z hostem lokalnym . Na przykład zobacz stackoverflow.com/questions/1134290/… . Proponuję edycji hostspliku i aliasing coś podobnego myserver.localdo 127.0.0.1. Następnie możesz użyć tego, aby uzyskać dostęp do lokalnego serwera (i podczas ustawiania plików cookie) i miejmy nadzieję, że wszystko powinno działać.
aroth
3
Wszystkie tworzone i pobierane wartości plików cookie muszą być ciągami znaków. Ciągi mogą zawierać znaki, które mogą zakłócać pamięć lokalną podczas próby ich pobrania. Jedną rzeczą, którą chciałbym zasugerować, jest użycie globalnych encodeURI()& decodeURI()metod dla nazwy i wartości pliku cookie, aby obsłużyć każdą konwersję, która musiałaby mieć miejsce. tj document.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue).
Dzeimsas Zvirblis
2
Jeśli twój kod po stronie serwera jest napisany w C #, Rick Strahl zapewnia metodę uzyskiwania domeny podstawowej, np. Example.com
CAK2
Niestety sub.example.comnie można ustawić pliku cookie do .example.comużywania javascript
Marinos An
27

Chcesz:

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

Zgodnie z RFC 2109 , aby plik cookie był dostępny dla wszystkich subdomen, należy umieścić .przed nazwą domeny.

Ustawienie ścieżki = / spowoduje, że plik cookie będzie dostępny w całej określonej domenie (aka .example.com).

Mike Lewis
źródło
FWIW - Myślę, że musisz usunąć element „path = expires =” i ustawić go na „expires =”.
malonso
3
Zgodnie z nowszym dokumentem RFC 6265 nie jest już konieczne umieszczanie przedrostka. domeny.
Dan
6

Oto działający przykład:

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

Jest to ogólne rozwiązanie, które pobiera domenę główną z obiektu lokalizacji i ustawia plik cookie. Cofnięcie jest spowodowane tym, że nie wiesz, ile masz subdomen, jeśli w ogóle.

caseyjustus
źródło
2

Możesz także skorzystać z MDN JavaScript Cookie Framework i wykonać:

docCookies.setItem('HelloWorld', 'HelloWorld', myDate, '/', 'example.com');
rebagliatte
źródło