ฉันจะสร้างคุกกี้ถาวรและคุกกี้ที่ไม่ถาวรได้อย่างไร

ดูเหมือนฉันจะนึกไม่ออกว่าจะสร้างคุกกี้แบบถาวรและคุกกี้แบบไม่ถาวรได้อย่างไร ในส่วนหัว HTTP ที่ถูกส่งกลับแตกต่างกันอย่างไร


person Chung Wu    schedule 06.10.2010    source แหล่งที่มา


คำตอบ (4)


คุกกี้มีวันหมดอายุที่กำหนดโดยปริยายหรือชัดเจน ซึ่งจะควบคุมระยะเวลาที่คุกกี้จะคงอยู่ (ขึ้นอยู่กับตัวแทนผู้ใช้ที่บังคับใช้จริง) คุกกี้อาจคงอยู่ในช่วงเวลาของเซสชันเท่านั้น (หรือในช่วงเวลาที่สั้นกว่านั้น)

หากคุกกี้ถูกต้อง คุกกี้จะถูกส่งไปพร้อมกับคำขอ HTTP ไปยังโดเมนที่เป็นแหล่งที่มา เฉพาะโดเมนที่ตั้งค่าคุกกี้เท่านั้นที่สามารถอ่านคุกกี้ได้ (แม้ว่าจะมีวิธีใช้ประโยชน์จากสิ่งนี้ เช่น การเขียนสคริปต์ข้ามไซต์)

  • หากคุณต้องการให้คุกกี้หมดอายุตามเวลาที่กำหนด ให้กำหนดวันหมดอายุโดยใช้ภาษาไคลเอ็นต์หรือฝั่งเซิร์ฟเวอร์ที่คุณเลือก

  • หากคุณต้องการให้คุกกี้หมดอายุเมื่อเซสชันสิ้นสุดลง อย่ากำหนดวันหมดอายุ

จาก RFC (เน้นที่ของฉัน):

ผู้ตั้งค่าคุกกี้สามารถระบุวันที่ลบได้ ซึ่งในกรณีนี้คุกกี้จะถูกลบออกในวันที่นั้น

หากตัวตั้งค่าคุกกี้ไม่ได้ระบุวันที่ คุกกี้จะถูกลบออกเมื่อผู้ใช้ออกจากเบราว์เซอร์ของตน

ด้วยเหตุนี้ การระบุวันที่จึงเป็นวิธีการหนึ่งในการทำให้คุกกี้คงอยู่ตลอดเซสชันต่างๆ ด้วยเหตุนี้ คุกกี้ที่มีวันหมดอายุจึงเรียกว่าคุกกี้ถาวร

ตามตัวอย่างแอปพลิเคชัน ไซต์ช็อปปิ้งสามารถใช้คุกกี้ถาวรเพื่อจัดเก็บสินค้าที่ผู้ใช้ใส่ไว้ในตะกร้าของตน (ในความเป็นจริง คุกกี้อาจอ้างถึงรายการในฐานข้อมูลที่จัดเก็บไว้ในไซต์ช้อปปิ้ง ไม่ใช่บนคอมพิวเตอร์ของคุณ) ด้วยวิธีนี้ หากผู้ใช้ออกจากเบราว์เซอร์โดยไม่ทำการซื้อและกลับมาใหม่ในภายหลัง พวกเขายังคงพบรายการเดียวกันใน ตะกร้าจะได้ไม่ต้องมองหาสิ่งของเหล่านี้อีก หากคุกกี้เหล่านี้ไม่ได้ระบุวันหมดอายุ คุกกี้จะหมดอายุเมื่อปิดเบราว์เซอร์ และข้อมูลเกี่ยวกับเนื้อหาในตะกร้าจะหายไป

person Tim Medora    schedule 06.10.2010
comment
และหากฉันต้องการให้คุกกี้คงอยู่ตลอดเซสชัน ฉันควรตั้งค่าวันหมดอายุใด - person Chung Wu; 06.10.2010
comment
ขอบคุณ! นั่นหมายความว่า Set-Cookie ใด ๆ ที่ไม่มีข้อหมดอายุจะเป็นคุกกี้เซสชันและจะหายไปเมื่อเบราว์เซอร์รีสตาร์ทหรือไม่ เพราะนั่นไม่ใช่สิ่งที่ฉันเห็น... เมื่อฉันทำ Set-Cookie โดยไม่หมดอายุ และรีสตาร์ทเบราว์เซอร์ ฉันยังคงสามารถอ่านคุกกี้นั้นกลับมาได้ คาดหวังอย่างนั้นเหรอ? - person Chung Wu; 06.10.2010
comment
ฉันตรวจสอบอีกครั้งเพื่อความแน่ใจและโพสต์ลิงก์เพิ่มเติมบางส่วน คุณใช้ภาษา/เว็บเซิร์ฟเวอร์ใดที่คุณพบพฤติกรรมนี้ - person Tim Medora; 06.10.2010
comment
เพื่อน ฉันขอโทษที่เปลี่ยนสิ่งนี้เป็นเซสชันการแก้ไขข้อบกพร่อง! ฉันใช้ไพลอน แต่ตอนนี้ฉันแค่ดูส่วนหัว HTTP หลังจากทำ Set-Cookie key=something; path=/; รีสตาร์ทเบราว์เซอร์ และโหลดหน้าซ้ำ ฉันเห็นว่าคุกกี้นั้นยังอยู่ในคำขอ ไม่แน่ใจว่าฉันขาดอะไรอีก ... - person Chung Wu; 07.10.2010
comment
ไม่ต้องห่วง. หากคุณดูที่ระบบไฟล์จริงคุณจะเห็นคุกกี้ที่เก็บไว้ที่นั่นหรือไม่? ใน IE บน Vista/Windows 7 คุกกี้ควรอยู่ใน C:\Users\[ชื่อผู้ใช้]\AppData\Local\Microsoft\Windows\Temporary Internet Files - person Tim Medora; 07.10.2010
comment
ในที่สุดฉันก็รู้ว่าเกิดอะไรขึ้น บน Firefox หากคุณเปิดการกู้คืนเซสชัน (เมื่อ Firefox เริ่มทำงาน: แสดงหน้าต่างและแท็บของฉันจากครั้งล่าสุด) มันจะกู้คืนแม้แต่คุกกี้เซสชันเมื่อคุณรีสตาร์ท! ดู bugzilla.mozilla.org/show_bug.cgi?id=443354 - person Chung Wu; 13.10.2010
comment
นั่นเป็นพฤติกรรมที่น่าสนใจ...ในอีกด้านหนึ่ง ดูเหมือนว่าจะเป็นข้อบกพร่องใหญ่ ในทางกลับกัน ฉันเข้าใจได้ว่าทำไมผู้ใช้ที่ไม่เชี่ยวชาญด้านเทคนิคจึงคาดหวังให้เซสชันของตนดำเนินต่อไปได้ ตามทฤษฎีแล้ว คุณสามารถตรวจสอบอย่างจำกัดกับสถานการณ์ดังกล่าวได้ โดยดูว่าเซสชันที่คุกกี้อ้างอิงถึงยังคงมีอยู่จริงหรือไม่ แม้ว่าฉันจะพบว่าการตรวจสอบเช่นนั้นอาจทำได้ยากและมีแนวโน้มที่จะเกิดข้อผิดพลาดอย่างฉาวโฉ่ก็ตาม วิธีที่ง่ายกว่าคือเพียงเขียนคุกกี้ถาวรทุกครั้งที่ดูเพจพร้อมวันที่ และตรวจสอบว่าผ่านไปนานแค่ไหนนับตั้งแต่กิจกรรมครั้งล่าสุด - person Tim Medora; 14.10.2010
comment
ดูเหมือนว่าน่าแปลกใจที่การเพิ่มวันที่ลงในคุกกี้จะทำให้คุกกี้ทำงานต่อเนื่อง - person Robert Moore; 15.06.2017
comment
คุณสามารถทำเช่นนี้กับ max-age ได้หรือไม่ - person Aaron Franke; 19.11.2019
comment
@AaronFranke - ดูเหมือนว่าคุณสามารถสร้างคุกกี้ถาวรด้วย max-age: tools.ietf.org /html/rfc6265#page-21 - person Tim Medora; 19.11.2019

มีคุกกี้สองประเภทใน ASP.NET

คุกกี้ถาวร:

คุกกี้จะถูกจัดเก็บไว้ในฮาร์ดดิสก์ของคอมพิวเตอร์ของคุณ พวกมันจะอยู่บนฮาร์ดดิสก์ของคุณและสามารถเข้าถึงได้โดยเว็บเซิร์ฟเวอร์จนกว่าพวกมันจะถูกลบหรือหมดอายุ

public void SetPersistentCookies(string name, string value)
{
    HttpCookie cookie = new HttpCookie(name);

    cookie.Value = value;

    cookie.Expires = Convert.ToDateTime(“12/12/2008″);

    Response.Cookies.Add(cookie);
}

คุกกี้ที่ไม่ถาวร:

คุกกี้จะถูกบันทึกในขณะที่เว็บเบราว์เซอร์ของคุณกำลังทำงานอยู่เท่านั้น เว็บเซิร์ฟเวอร์สามารถใช้งานได้จนกว่าคุณจะปิดเบราว์เซอร์เท่านั้น พวกเขาจะไม่ถูกบันทึกไว้ในดิสก์ของคุณ

public void SetNonPersistentCookies(string name, string value)
{
    HttpCookie cookie = new HttpCookie(name);

    cookie.Value = value;

    Response.Cookies.Add(cookie);
}
person Deepak.Aggrawal    schedule 02.08.2011

คุกกี้เซสชั่น

HttpCookie cookie = new HttpCookie("myCookieName", "myCookieValue");
Response.Cookies.Add(cookie);

คุกกี้ที่มีการประทับเวลาที่แน่นอน (.NET DateTime Library)

HttpCookie cookie = new HttpCookie("myCookieName", "myCookieValue");
cookie.Expires = DateTime.Today.AddMonths(12); //or AddMinutes, or AddHours...
Response.Cookies.Add(cookie);

คุกกี้ถาวร

HttpCookie cookie = new HttpCookie("myCookieName", "myCookieValue");
cookie.Expires = DateTime.MaxValue;
Response.Cookies.Add(cookie);
person expertCode    schedule 07.06.2011

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

ข้อมูลอ้างอิง: https://www.cookiepro.com/knowledge/what-is-a-persistent-cookie/

หากคุกกี้ไม่มีวันหมดอายุ จะถือว่าเป็นคุกกี้เซสชัน/ไม่ถาวร

ดังนั้น โดยพื้นฐานแล้วคุกกี้ถาวรจะมาพร้อมกับแอตทริบิวต์ expires เช่น

expires="Wdy, DD-Mon-YYYY HH:MM:SS GMT"
person Saikat    schedule 10.12.2019