อะไรคือความแตกต่างระหว่าง Session.Abandon () และ Session.Clear ()


110

อะไรคือความแตกต่างระหว่างการทำลายเซสชันและการลบค่า? คุณช่วยยกตัวอย่างที่แสดงให้เห็นได้ไหม

ฉันค้นหาคำถามนี้ แต่ไม่เข้าใจคำตอบทั้งหมด บางคำตอบคือ:

  • Session.Abandon() ทำลายเซสชัน
  • Session.Clear() เพียงแค่ลบค่าทั้งหมด

เพื่อนบอกฉันว่า:

การล้างเซสชันจะไม่เป็นการยกเลิกการตั้งค่าเซสชัน แต่ยังคงมีอยู่ด้วย ID เดียวกันสำหรับผู้ใช้ แต่ด้วยการล้างค่า

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

โค้ดด้านล่างนี้ใช้งานได้และไม่มีข้อยกเว้นใด ๆ

Session.Abandon();
Session["tempKey1"] = "tempValue1";

เมื่อคุณละทิ้ง () เซสชันคุณ (หรือผู้ใช้) จะได้รับ SessionId ใหม่

เมื่อฉันทดสอบเซสชันจะไม่มีการเปลี่ยนแปลงใด ๆ เมื่อฉันละทิ้งเซสชัน

ฉันพบความแตกต่างอย่างหนึ่ง: session.Abandon()ทำให้เกิดSession_Endเหตุการณ์


5
เซสชันล้างรายการออกทันที แต่เซสชันแบนดอนทำเครื่องหมายเซสชันที่จะละทิ้งเมื่อสิ้นสุดคำขอปัจจุบัน
RepDbg

คำตอบ:


149

ล้าง - ลบคีย์และค่าทั้งหมดออกจากคอลเล็กชันสถานะเซสชัน

ละทิ้ง - ลบวัตถุทั้งหมดที่เก็บไว้ในเซสชัน หากคุณไม่เรียกใช้เมธอด Abandon อย่างชัดเจนเซิร์ฟเวอร์จะลบอ็อบเจ็กต์เหล่านี้และทำลายเซสชันเมื่อเซสชันหมดเวลา
นอกจากนี้ยังก่อให้เกิดเหตุการณ์เช่นSession_End

Session.Clear สามารถเทียบกับการเอาหนังสือทุกเล่มจากชั้นวางในขณะที่ Session.Abandon เป็นเหมือนการโยนไปทั้งชั้น

คุณพูด:

เมื่อฉันทดสอบเซสชันจะไม่มีการเปลี่ยนแปลงใด ๆ เมื่อฉันละทิ้งเซสชัน

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

ถ้าคุณจะใช้ Session.Clear คุณจะมีเซสชันเดียวกันในหลาย ๆ คำขอ

โดยทั่วไปในกรณีส่วนใหญ่คุณต้องใช้ Session.Clear
คุณสามารถใช้ Session.Abandon ได้หากคุณแน่ใจว่าผู้ใช้กำลังจะออกจากไซต์ของคุณ

กลับไปที่ความแตกต่าง:

  1. Abandon เพิ่มคำขอ Session_End
  2. ล้างลบรายการอย่างไม่เหมาะสม Abandon ทำไม่ได้
  3. Abandon เผยแพร่อ็อบเจ็กต์ SessionState และไอเท็มเพื่อให้สามารถเก็บขยะเพื่อปลดปล่อยทรัพยากรได้ Clear ช่วยให้ SessionState และทรัพยากรเชื่อมโยงกับมัน

และถ้าฉันเรียก session.clear () สิ่งนี้คุณจะบอกว่า accures อีกครั้ง ไม่? (อื่น ๆ เพิ่มเหตุการณ์ Session_End)
backdoor

Session.Clear จะเพียงลบรายการออกจากการประชุม ไม่มีอะไรมาก คุณสามารถเรียกใช้กี่ครั้งก็ได้ตามต้องการ
Dmytrii Nagirniak

@AnthonyWJones คุณพูดถูก "ทำลาย" ไม่ถูกต้องที่จะพูด ดีกว่าคือลบวัตถุออกจากเซสชัน แต่ Session.Clear ยังไม่ทำลายวัตถุมันจะลบ thm ออกจากเซสชั่นเพื่อให้สามารถเก็บขยะได้ นอกจากนี้ไม่แนะนำให้จัดเก็บวัตถุ COMPLEX มิฉะนั้นฉันถือว่าดี
Dmytrii Nagirniak

@Dmitriy: ทำไม "ไม่แนะนำให้จัดเก็บวัตถุ COMPLEX"?
Kamarey

5
@ ฉันเห็นด้วยแม้ว่าฉันจะขยายความโดยบอกว่าSession.Clearเปรียบได้กับการนำหนังสือทั้งหมดออกจากชั้นวางทันทีแต่Session.Abandonก็เหมือนกับการพูดว่า "ทิ้งทั้งชั้นและแจ้งให้เราทราบเมื่อคุณทำเสร็จแล้ว "
WynandB

20

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


3
ขอบคุณ. แต่เมื่อเข้าร่วมกับหนังสือ macdonalds ของ Mattew ก็สามารถใช้รหัสเซสชันเดียวกันได้ ฉันหมายความว่าหากแอตทริบิวต์ regenerateExpiredSessionId ที่องค์ประกอบ configuration / system.web / sessionState ในไฟล์ web.config เป็นเท็จ ASP.Net ใช้รหัสเซสชันเก่า
backdoor

2
@Hans Kesting เขาจะไม่ได้รับรหัสเซสชันใหม่เมื่อมีการเรียกละทิ้ง เขาต้องตั้งค่าคุกกี้ ASPNET_SessionID ให้เป็นโมฆะอย่างชัดเจนเพื่อรับรหัสเซสชันใหม่
Zo มี

9

นี่คือการจัดเรียงของการคุ้มครองโดยการตอบสนองต่างๆข้างต้น แต่ครั้งแรกที่ผมอ่านบทความนี้ฉันคิดถึงความจริงที่สำคัญซึ่งนำไปสู่ข้อผิดพลาดเล็ก ๆ น้อย ๆ ในรหัสของฉัน ...

Session.Clear() จะล้างค่าของคีย์ทั้งหมด แต่จะไม่ทำให้เหตุการณ์สิ้นสุดเซสชันเริ่มทำงาน

Session.Abandon()จะไม่ล้างค่าในคำขอปัจจุบัน หากมีการร้องขอหน้าอื่นค่าจะหายไปสำหรับหน้านั้น อย่างไรก็ตามละทิ้งจะโยนเหตุการณ์

ดังนั้นในกรณีของฉัน (และบางทีในคุณ?) ผมจำเป็นต้องมีตามมาด้วยClear()Abandon()


1
ทำไมคุณถึงต้องการ Session.Clear () ตามด้วย Session.Abandon ()? คุณกำลังล้างค่าของคอลเลกชันที่คุณกำลังทำลาย? สิ่งนี้ซ้ำซ้อนโดยสิ้นเชิง แน่ใจว่าวัตถุเซสชันไม่ได้ถูกทำลายในทันที (ซึ่งเกิดขึ้นเมื่อสิ้นสุดการร้องขอปัจจุบัน) แต่รหัสเซสชันนั้นจะไม่ได้รับการให้บริการตามคำขอที่ตามมาอีกต่อไป หากลูกค้าทำการร้องขอใหม่เซสชันใหม่จะถูกมอบให้กับพวกเขา การเรียก Clear ก่อนจะทำให้เกิดปัญหาหากคุณต้องการเข้าถึงตัวแปรเซสชันใด ๆ ในเหตุการณ์ Session_End () ของ Global Asax (จะไม่อยู่ที่นั่นเพราะคุณเคลียร์)
RepDbg

@RepDbg จริงๆแล้วฉันไม่เห็นด้วย เซสชัน. แบนดอน (). ให้รหัสเซสชันใหม่แก่ลูกค้า Session.clear ล้างข้อมูลทั้งหมดบนเซิร์ฟเวอร์เกี่ยวกับเซสชันเพื่อไม่ให้ผู้ใช้รายอื่นสามารถทำได้ฉันเห็นด้วยกับ NRC
Micah Armantrout

@ Micah Armantrout ฉันไม่ได้ทำตามตรรกะของคุณ ทำไมต้องล้างเซสชันด้วย Session.Clear () แล้วเรียก Session.Abandon () ซึ่งไม่เพียง แต่ล้างเซสชันเท่านั้น แต่ยังยกเลิกการจัดสรรทั้งหมดด้วย นอกจากนี้ Session.Abandon () ไม่ให้รหัสเซสชันใหม่แก่ลูกค้า คำขอที่ตามมาจะดำเนินการ แต่ไม่ใช่การดำเนินการตามคำขอที่เรียกว่า Session.Abandon ()
RepDbg

ถ้าคุณใช้แค่ Session.Abandon ตรรกะอื่น ๆ ที่เหลือในไปป์ไลน์ ASP.NET ยังคงสามารถเข้าถึงค่าเซสชันปัจจุบันได้
Mark Sowul

6

รหัสนี้ใช้งานได้และอย่าทิ้งข้อยกเว้นใด ๆ :

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

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

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

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

หากคุณเข้าถึงตัวแปร MyName บนเว็บเพจที่ตามมาจะว่างเปล่า นี่เป็นเพราะ MyName ถูกทำลายด้วยวัตถุ Session ก่อนหน้าเมื่อหน้าที่มีตัวอย่างก่อนหน้าเสร็จสิ้นการประมวลผล

จากMSDN เซสชันแบนดอน


3

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


ขอบคุณ แต่สิ่งนี้ได้ผล: (ไม่สอดคล้องกับความคิดของคุณ) Session.Abandon (); เซสชัน ["tempKey1"] = "tempValue1"; Response.Write (Session ["tempKey1"]. ToString ());
backdoor

เนื่องจากเซสชันจะถูกทำลายหลังจากที่คุณรีเฟรชหน้าเว็บจริง รหัสเซสชัน (โดยปกติ) เก็บไว้ในคุกกี้
RaYell

ฉันไม่เข้าใจ ฉันหมายถึงหลังจากที่ฉันโทรหา Session Bandon () ฉันยังสามารถเพิ่มค่าลงไปได้ (แม้ว่าเพจจะถูกโพสต์และแสดงผลอีกครั้ง)
backdoor

1
คุณอาจให้เซสชันของคุณตั้งค่าให้สร้างรหัสอัตโนมัติหลังจากที่มันถูกทำลาย ดังนั้นเมื่อคุณกำหนดค่าให้กับเซสชันที่ถูกทำลายเซสชันใหม่จะถูกสร้างขึ้นโดยอัตโนมัติ
RaYell

1
ใช่การใช้รหัสเซสชันนี้จะสร้างใหม่ แต่คำถามของฉันคืออะไรคือความแตกต่างระหว่าง session.clear () และ session.abandone () เลย ด้วยวิธีนี้เมื่อตั้งค่าการสร้างอัตโนมัติเป็นเท็จการลากจูงเหล่านี้ไม่แตกต่างจากสิ่งอื่นใดที่เพิ่ม Sesion_End?
backdoor

3

ล้าง - ลบคีย์หรือค่าออกจากคอลเล็กชันสถานะเซสชัน ..

ละทิ้ง - ลบหรือลบวัตถุเซสชันจากเซสชัน ..


1
Session.Abandon() 

จะทำลาย / ฆ่าทั้งเซสชั่น

Session.Clear()

ลบ / ล้างข้อมูลเซสชัน (เช่นคีย์และค่าจากเซสชันปัจจุบัน) แต่เซสชันจะยังมีชีวิตอยู่

เปรียบเทียบกับ Session.Abandon () วิธีการ Session.Clear () ไม่ได้สร้างเซสชันใหม่เพียงแค่ทำให้ตัวแปรทั้งหมดในเซสชันเป็น NULL

รหัสเซสชันจะยังคงเหมือนเดิมในทั้งสองกรณีตราบใดที่ยังไม่ปิดเบราว์เซอร์

Session.RemoveAll()

จะลบคีย์และค่าทั้งหมดออกจากคอลเล็กชันสถานะเซสชัน

Session.Remove()

จะลบรายการออกจากคอลเล็กชันสถานะเซสชัน

Session.RemoveAt()

มันลบไอเท็มที่ดัชนีที่ระบุจากคอลเล็กชันสถานะเซสชัน

Session.TimeOut()

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

หากผู้ใช้ไม่รีเฟรชหรือร้องขอเพจภายในช่วงหมดเวลาเซสชันจะสิ้นสุดลง


0

การมีอยู่ของ sessionid อาจทำให้เกิดการโจมตีการตรึงเซสชันซึ่งเป็นจุดหนึ่งในการปฏิบัติตาม PCI หากต้องการลบ sessionid และเอาชนะการโจมตีการตรึงเซสชันโปรดอ่านโซลูชันนี้ - จะหลีกเลี่ยงช่องโหว่การตรึงเซสชันใน ASP.NET ได้อย่างไร .


0

ฉันคิดว่ามันจะมีประโยชน์ในการใช้งานมากกว่าการใช้Session.Clear()Session.Abandon()

เนื่องจากค่ายังคงมีอยู่ในเซสชันหลังจากโทรในภายหลัง แต่จะถูกลบออกไปหลังจากเรียกอดีต


0
this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

สิ่งหนึ่งที่ควรทราบที่นี่ Session.Clear ลบรายการทันที แต่ Session.Abandon ทำเครื่องหมายเซสชันที่จะละทิ้งเมื่อสิ้นสุดคำขอปัจจุบัน นั่นหมายความว่าสมมติว่าคุณพยายามเข้าถึงค่าในโค้ดหลังจากรันคำสั่ง session.abandon มันจะยังคงอยู่ที่นั่น ดังนั้นอย่าสับสนหากโค้ดของคุณไม่ทำงานแม้ว่าจะออกคำสั่ง session.abandon และใช้ตรรกะบางอย่างกับเซสชันทันที

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