แอปพลิเคชัน Django ของเรามีข้อกำหนดการจัดการเซสชันดังต่อไปนี้
- เซสชันจะหมดอายุเมื่อผู้ใช้ปิดเบราว์เซอร์
- เซสชันจะหมดอายุหลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่ง
- ตรวจจับเมื่อเซสชันหมดอายุเนื่องจากไม่มีการใช้งานและแสดงข้อความที่เหมาะสมแก่ผู้ใช้
- เตือนผู้ใช้ว่าเซสชันที่กำลังจะมาถึงจะหมดอายุภายในไม่กี่นาทีก่อนสิ้นสุดช่วงเวลาที่ไม่มีการใช้งาน นอกจากคำเตือนแล้วให้ผู้ใช้มีตัวเลือกในการขยายเซสชัน
- หากผู้ใช้ทำงานในกิจกรรมทางธุรกิจที่ยาวนานภายในแอปที่ไม่เกี่ยวข้องกับคำขอที่ส่งไปยังเซิร์ฟเวอร์เซสชันจะต้องไม่หมดเวลา
หลังจากอ่านเอกสารโค้ด Django และบล็อกโพสต์บางส่วนที่เกี่ยวข้องกับเรื่องนี้ฉันได้คิดแนวทางการใช้งานต่อไปนี้
ข้อกำหนด 1
ข้อกำหนดนี้สามารถนำไปใช้ได้อย่างง่ายดายโดยตั้งค่า SESSION_EXPIRE_AT_BROWSER_CLOSE เป็น True
ข้อกำหนด 2
ฉันได้เห็นคำแนะนำบางประการในการใช้ SESSION_COOKIE_AGE เพื่อกำหนดระยะเวลาหมดอายุของเซสชัน แต่วิธีนี้มีปัญหาดังต่อไปนี้
เซสชันจะหมดอายุเมื่อสิ้นสุด SESSION_COOKIE_AGE เสมอแม้ว่าผู้ใช้จะใช้งานแอปพลิเคชันอยู่ก็ตาม (สามารถป้องกันได้โดยตั้งค่าการหมดอายุของเซสชันเป็น SESSION_COOKIE_AGE ในทุกคำขอโดยใช้มิดเดิลแวร์ที่กำหนดเองหรือโดยการบันทึกเซสชันในทุกคำขอโดยตั้งค่า SESSION_SAVE_EVERY_REQUEST เป็นจริง แต่ปัญหาถัดไปไม่สามารถหลีกเลี่ยงได้เนื่องจากการใช้ SESSION_COOKIE_AGE)
เนื่องจากวิธีการทำงานของคุกกี้ SESSION_EXPIRE_AT_BROWSER_CLOSE และ SESSION_COOKIE_AGE จึงไม่สามารถใช้ร่วมกันได้กล่าวคือคุกกี้จะหมดอายุเมื่อปิดเบราว์เซอร์หรือเมื่อถึงเวลาหมดอายุที่กำหนด หากใช้ SESSION_COOKIE_AGE และผู้ใช้ปิดเบราว์เซอร์ก่อนที่คุกกี้จะหมดอายุคุกกี้จะยังคงอยู่และการเปิดเบราว์เซอร์อีกครั้งจะอนุญาตให้ผู้ใช้ (หรือบุคคลอื่น) เข้าสู่ระบบโดยไม่ต้องตรวจสอบสิทธิ์อีกครั้ง
Django อาศัยเฉพาะคุกกี้ที่มีอยู่เพื่อตรวจสอบว่าเซสชันนั้นทำงานอยู่หรือไม่ ไม่ได้ตรวจสอบวันหมดอายุของเซสชันที่เก็บไว้กับเซสชัน
สามารถใช้วิธีการต่อไปนี้เพื่อดำเนินการตามข้อกำหนดนี้และเพื่อแก้ไขปัญหาที่กล่าวถึงข้างต้น
- อย่าตั้งค่า SESSION_COOKIE_AGE
- กำหนดวันหมดอายุของเซสชันเป็น 'เวลาปัจจุบัน + ช่วงเวลาที่ไม่มีการใช้งาน' สำหรับทุกคำขอ
- แทนที่ process_request ใน SessionMiddleware และตรวจสอบการหมดอายุของเซสชัน ทิ้งเซสชันหากหมดอายุแล้ว
ข้อกำหนด 3
เมื่อเราตรวจพบว่าเซสชันหมดอายุ (ใน SessionMiddleware ที่กำหนดเองด้านบน) ให้ตั้งค่าแอตทริบิวต์ตามคำขอเพื่อระบุการหมดอายุของเซสชัน แอตทริบิวต์นี้สามารถใช้เพื่อแสดงข้อความที่เหมาะสมแก่ผู้ใช้
ข้อกำหนด 4
ใช้ JavaScript เพื่อตรวจจับการไม่ใช้งานของผู้ใช้ให้คำเตือนและตัวเลือกในการขยายเซสชัน หากผู้ใช้ต้องการขยายให้ส่งชีพจร Keep alive ไปยังเซิร์ฟเวอร์เพื่อขยายเซสชัน
ข้อกำหนด 5
ใช้ JavaScript เพื่อตรวจจับกิจกรรมของผู้ใช้ (ในระหว่างการดำเนินธุรกิจที่ยาวนาน) และส่งพัลส์ที่ยังมีชีวิตอยู่ไปยังเซิร์ฟเวอร์เพื่อป้องกันไม่ให้เซสชันหมดอายุ
แนวทางการนำไปใช้ข้างต้นดูซับซ้อนมากและฉันสงสัยว่าอาจมีวิธีที่ง่ายกว่านี้ (โดยเฉพาะสำหรับข้อกำหนด 2)
ข้อมูลเชิงลึกใด ๆ จะได้รับการชื่นชมอย่างมาก