Membuat cookie JavaScript di domain dan membacanya di seluruh sub domain

101

Di bawah ini adalah cookie JavaScript yang ditulis di komputer pengguna selama 12 bulan.

Setelah kami menetapkan cookie di domain utama kami seperti example.com, jika pengguna mengunjungi subdomain seperti test.example.com, kami perlu terus mengidentifikasi aktivitas pengguna di seluruh subdomain "uji" kami.

Namun dengan kode saat ini, segera setelah mereka pergi www.example.comdan berkunjung test.example.com, mereka tidak lagi ditandai sebagai "HelloWorld".

Adakah yang bisa membantu dengan kode saya untuk memungkinkan cookie dibaca di seluruh subdomain?

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

Jawaban:

209

Cukup atur atribut domainand pathpada cookie Anda, seperti:

<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
sumber
2
Saya mencoba melakukan ini di localhost dan saya tidak dapat mengubah jalur
Enve
7
@Enve - Browser memperlakukan cookie localhost sedikit berbeda dari cookie lainnya. Atau lebih tepatnya, mereka memperlakukan semua cookie dengan cara yang membuat bekerja dengan localhost menjadi sulit. Misalnya, lihat stackoverflow.com/questions/1134290/… . Saya sarankan mengedit Anda hostsberkas dan aliasing sesuatu seperti myserver.localuntuk 127.0.0.1. Kemudian Anda dapat menggunakannya untuk mengakses server lokal Anda (dan saat mengatur cookie), dan semoga semuanya berfungsi.
aroth
3
Semua nilai cookie yang Anda buat & ambil harus berupa nilai string. String dapat berisi karakter yang dapat mengganggu penyimpanan lokal saat mencoba mengambilnya kembali. Satu hal yang saya sarankan adalah menggunakan metode encodeURI()& global decodeURI()untuk nama & nilai cookie untuk menangani setiap konversi yang perlu dilakukan. mis document.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue).
Dzeimsas Zvirblis
2
Jika kode sisi server Anda ditulis dalam C #, Rick Strahl menyediakan metode untuk mendapatkan domain dasar, misalnya example.com, dari domain di weblog.west-wind.com/posts/2012/Apr/24/…
CAK2
Sayangnya sub.example.comtidak dapat mengatur cookie untuk .example.commenggunakan javascript
Marinos An
27

Kamu ingin:

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

Sesuai dengan RFC 2109 , agar cookie tersedia untuk semua subdomain, Anda harus meletakkannya .di depan domain Anda.

Menyetel jalur = / akan membuat cookie tersedia di seluruh domain yang ditentukan (alias .example.com).

Mike Lewis
sumber
FWIW - Saya pikir Anda perlu menghapus bagian "path = expires =" dan mengaturnya ke "expires =".
malonso
3
Sesuai dengan RFC 6265 yang lebih baru , tidak perlu lagi menyertakan bagian .depan domain.
Dan
6

Berikut adalah contoh yang berfungsi:

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

Ini adalah solusi umum yang mengambil domain root dari objek lokasi dan menyetel cookie. Pembalikannya adalah karena Anda tidak tahu berapa banyak subdomain yang Anda miliki, jika ada.

caseyjustus
sumber
2

Anda juga dapat menggunakan MDN JavaScript Cookie Framework dan melakukan:

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