วิธีแก้ไขปัญหาเซสชันนี้ใน ASP.NET, VB.NET

วิธีแก้ไขปัญหาเซสชันนี้ใน ASP.NET, VB.NET

มีข้อกำหนดดังต่อไปนี้:

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

วิธีแก้ไขที่เราใช้คือ: เราได้เก็บ "Is_Loggedin" ไว้เป็นคอลัมน์ที่มีประเภทข้อมูล "bit" ใน mst_vendor เป็นชื่อตาราง เมื่อผู้ใช้เข้าสู่ระบบ เราจะตั้งค่าสถานะ Is_Loggedin เป็น "1" และทุกครั้งที่มีคนพยายามเข้าสู่ระบบโดยใช้บัญชีนี้ ระบบจะแสดงข้อผิดพลาด "ผู้ใช้เข้าสู่ระบบแล้ว"

เมื่อผู้ใช้ออกจากระบบ ระบบจะเปลี่ยนเป็น "0" เนื่องจากขั้นตอนการออกจากระบบเรียกใช้ทันทีที่ผู้ใช้คลิกปุ่มออกจากระบบ

สถานการณ์ปัญหา:

  1. เมื่อผู้ใช้ปิดเบราว์เซอร์ การตั้งค่าสถานะจะยังคงเหมือนเดิม นั่นคือ "1"

  2. เมื่อดับเครื่องจะยังคงเหมือนเดิมเป็น "1"

  3. หากหมดเวลาเซสชันหลังจากค่าที่กำหนดไว้ล่วงหน้า เซสชันจะยังคงเหมือนเดิม

  4. อาจมีสถานการณ์ที่แตกต่างกันนอกเหนือจากนี้

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

อาจปรับปรุงประสิทธิภาพของระบบและยังช่วยขจัดสถานการณ์ปัญหาข้างต้นอีกด้วย


person vishal    schedule 30.11.2010    source แหล่งที่มา
comment
หากคุณต้องการคำตอบ vb.net ทำไมต้องใช้แท็ก C# และ C++   -  person Hans Kesting    schedule 30.11.2010


คำตอบ (5)


คุณควรใช้ไฟล์ Global.asax และใช้ฟังก์ชัน Session_End

Session_End: เริ่มทำงานเมื่อ เซสชันของผู้ใช้หมดเวลา สิ้นสุด หรือออกจากเว็บไซต์แอปพลิเคชัน

person Kimtho6    schedule 30.11.2010
comment
ฉันจะเชื่อเมื่อฉันเห็นมัน เซิร์ฟเวอร์จะทราบได้อย่างไรเมื่อเบราว์เซอร์ถูกปิด? - person m.edmondson; 30.11.2010
comment
ไม่ได้แจ้งให้ทราบว่าเบราว์เซอร์ถูกปิดเมื่อใด แต่ในที่สุดเซสชันจะหมดเวลาและ Session_End จะถูกยกขึ้น/เริ่มทำงาน - person StuperUser; 30.11.2010
comment
หมายเหตุ: Session_End จะเริ่มทำงานสำหรับเซสชัน 'InProc' เท่านั้น - person Hans Kesting; 30.11.2010

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

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

person m.edmondson    schedule 30.11.2010

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

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

person tenfour    schedule 30.11.2010

จากมุมมองระดับบนสุด นี่คือสิ่งที่คุณสามารถทำได้

  • ใช้แคชกับ SlideExpiration

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

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

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

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

  • หากในกรณีที่ผู้ใช้พยายามเข้าสู่ระบบอีกครั้งก่อนที่แคชจะหมดอายุ ผู้ใช้จะต้องรอสักครู่เพื่อให้แคชหมดอายุ

  • หากผู้ใช้ออกจากระบบอย่างถูกต้อง คุณสามารถลบรายการแคชในเหตุการณ์ออกจากระบบได้ โดยที่ผู้ใช้ไม่ต้องรอเพื่อเข้าสู่ระบบใหม่

การหมดเวลาหมดอายุแบบเลื่อนสามารถซิงค์กับการหมดเวลาเซสชันเพื่อจำลองการหมดเวลาเซสชันจริงสำหรับแอปพลิเคชัน

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

person Danish Khan    schedule 30.11.2010

ใช่แล้ว สคริปต์น่าจะเป็นความคิดที่ดี เพียงตั้งค่าการหมดเวลาเซสชันเป็น 5 นาทีแทนที่จะเป็น 20 จากนั้นเขียนวิธีการลงใน session.end ในไฟล์ global.asax ที่อัปเดตฐานข้อมูลตามนั้น

person Exitos    schedule 30.11.2010
comment
สิ่งนี้จะไม่เกิดขึ้นหากเกิดไฟฟ้าดับ - person m.edmondson; 30.11.2010
comment
ทำไมจะไม่ล่ะ? หากไฟฟ้าดับที่ไคลเอ็นต์ เซสชันจะหมดเวลาตามปกติ - person StuperUser; 30.11.2010
comment
ฉันคิดว่าพวกเขาหมายถึงโดยทั่วไป นั่นคือทั้งบริษัทรวมถึงเซิร์ฟเวอร์ด้วย - person m.edmondson; 30.11.2010
comment
อันที่จริงไฟฟ้าดับที่เซิร์ฟเวอร์จะหมายความว่า Session_End จะไม่เริ่มทำงานตามปกติ ฉันไม่แน่ใจว่าจะเกิดอะไรขึ้น แผนการกู้คืนควรมีการรีเซ็ตแฟล็กเหล่านี้ - person StuperUser; 30.11.2010