การสร้างคุกกี้ JavaScript บนโดเมนและอ่านข้ามโดเมนย่อย


101

ด้านล่างนี้คือคุกกี้ JavaScript ที่เขียนบนคอมพิวเตอร์ของผู้ใช้เป็นเวลา 12 เดือน

หลังจากที่เราตั้งค่าคุกกี้ในโดเมนหลักของเราเช่นexample.comหากผู้ใช้ไปที่โดเมนย่อยเช่นtest.example.comนี้เราจำเป็นต้องระบุกิจกรรมของผู้ใช้ต่อไปในโดเมนย่อย "ทดสอบ" ของเรา

แต่ด้วยรหัสปัจจุบันทันทีที่พวกเขาออกไปwww.example.comและเยี่ยมชมtest.example.comพวกเขาจะไม่ถูกตั้งค่าสถานะเป็น "HelloWorld" อีกต่อไป

ใครจะสามารถช่วยรหัสของฉันเพื่ออนุญาตให้อ่านคุกกี้ข้ามโดเมนย่อยได้หรือไม่

<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 - เบราว์เซอร์ปฏิบัติต่อคุกกี้ localhost แตกต่างจากคุกกี้อื่น ๆ เล็กน้อย หรือมากกว่านั้นพวกเขาปฏิบัติต่อคุกกี้ทั้งหมดในลักษณะที่ทำให้การทำงานกับlocalhost เป็นเรื่องยาก ยกตัวอย่างเช่นดูstackoverflow.com/questions/1134290/... ผมขอแนะนำให้แก้ไขของคุณhostsไฟล์และ aliasing สิ่งที่ต้องการที่จะmyserver.local 127.0.0.1จากนั้นคุณสามารถใช้เพื่อเข้าถึงเซิร์ฟเวอร์ภายในของคุณ (และเมื่อตั้งค่าคุกกี้) และหวังว่าทุกอย่างจะทำงานได้
aroth

3
ค่าคุกกี้ทั้งหมดที่คุณสร้างและเรียกต้องเป็นค่าสตริง สตริงอาจมีอักขระที่อาจทำให้พื้นที่จัดเก็บในตัวเครื่องไม่พอใจเมื่อพยายามดึงข้อมูล สิ่งหนึ่งที่ฉันขอแนะนำคือการใช้ Global encodeURI()& decodeURI()method สำหรับชื่อและค่าคุกกี้เพื่อจัดการกับ Conversion ที่จะต้องเกิดขึ้น กล่าวคือdocument.cookie = encodeURI(cookieName) +"=" + encodeURI(cookieValue).
Dzeimsas Zvirblis

2
ถ้าโค้ดฝั่งเซิร์ฟเวอร์ของคุณเขียนด้วย C # Rick Strahl จะมีวิธีการรับโดเมนพื้นฐานเช่น example.com จากโดเมนที่weblog.west-wind.com/posts/2012/Apr/24/…
CAK2

น่าเสียดายที่sub.example.comไม่สามารถตั้งค่าคุกกี้เพื่อ.example.comใช้จาวาสคริปต์ได้
Marinos An

28

คุณต้องการ:

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

ตามRFC 2109เพื่อให้มีคุกกี้สำหรับโดเมนย่อยทั้งหมดคุณต้องใส่ไว้.หน้าโดเมนของคุณ

การตั้งค่าเส้นทาง = / จะทำให้คุกกี้พร้อมใช้งานภายในโดเมนที่ระบุทั้งหมด (aka .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=/"

นี่เป็นโซลูชันทั่วไปที่ใช้โดเมนรากจากวัตถุตำแหน่งและตั้งค่าคุกกี้ การย้อนกลับเป็นเพราะคุณไม่รู้ว่าคุณมีโดเมนย่อยกี่โดเมน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.