ฉันรู้ว่านี่เป็นโอกาสที่ดีที่จะถูกทำเครื่องหมายว่าซ้ำซ้อน แต่ไม่พบสิ่งที่ฉันกำลังมองหา
นี่เป็นปัญหาที่พบบ่อยและฉันแน่ใจว่ามันมีวิธีปฏิบัติที่ดีที่สุดที่กำหนดไว้
พื้นหลัง
แอป SaaS หน้าเดียวมีจำนวนมากลากและวางผู้ใช้สามารถโต้ตอบกับมันโดยไม่ต้องสื่อสารกับเซิร์ฟเวอร์เป็นระยะเวลานาน
เซสชันเซิร์ฟเวอร์เก็บวัตถุผู้ใช้เท่านั้นโดยใช้คุกกี้เซสชันที่ไม่ถาวร
เซสชันหมดอายุบนเซิร์ฟเวอร์หลังจาก X ชั่วโมง
บางสิ่งถูกโหลดระหว่างการล็อกอินเท่านั้น
ปัญหา
- ผู้ใช้ทำงานบนแอปเมื่อเสร็จแล้วผู้ใช้จะไม่ออกจากระบบเพียงเปิดเบราว์เซอร์ต่อไป
- ผู้ใช้กลับมาหลังจากผ่านไปนานกว่า X ชั่วโมง (เซสชันไม่ถูกต้องบนเซิร์ฟเวอร์)
- ผู้ใช้โต้ตอบกับแอปโดยไม่จำเป็นต้องเชื่อมต่อเซิร์ฟเวอร์ (ลากและวางสิ่งของแก้ไขข้อความ ... )
- เฉพาะในการโต้ตอบเซิร์ฟเวอร์ครั้งต่อไป (สมมติว่าไม่มีการบันทึกอัตโนมัติ) ผู้ใช้จะถูกส่งไปยังหน้าเข้าสู่ระบบและสูญเสียงานบางส่วนของพวกเขา
การแก้ปัญหาที่เป็นไปได้
นี่คือวิธีแก้ปัญหาบางอย่างที่ฉันมีในใจอยากจะได้ยินหากมีคนอื่นและถ้ามีอะไรผิดปกติกับพวกเขา
1. อย่าล็อกผู้ใช้ออก
- อย่างไร? อาจเก็บเซสชันที่ยาวนานเก็บคุกกี้ถาวรหรือ ping javaScript "keep alive"
- ข้อดี : ผู้ใช้ไม่จำเป็นต้องกังวลอะไรเลยแก้ไขปัญหาให้พวกเขา
- ข้อด้อย : ไม่เป็นไปตามมาตรฐาน PCI ไม่ปลอดภัยและต้องการการเปลี่ยนแปลงการพัฒนาเช่นสิ่งที่โหลดไปยังเซสชันเฉพาะเมื่อเข้าสู่ระบบของผู้ใช้จำเป็นต้องย้ายไปที่รูปแบบย่อย pub (ฟังการเปลี่ยนแปลงเหตุการณ์) หรือหมดเวลาแคช
2. การจัดเก็บในท้องถิ่น
- อย่างไร? ใช้ที่จัดเก็บในตัวเครื่องใหม่เพื่อเก็บสถานะไว้ชั่วคราวหากออกจากระบบเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบยังคงมีอยู่เมื่อลงชื่อเข้าใช้
- จุดเด่น : ยังเป็นฐานสำหรับการสนับสนุน "ทำงานออฟไลน์" ไม่เพียง แต่จัดการกับการหมดเวลาใช้งานเซสชัน
- ข้อด้อย : ยากที่จะนำไปใช้งาน, ต้องทำการผสานสถานะของทรีข้อมูล, ไม่ใช่ทุกเบราว์เซอร์ที่รองรับ
3. บันทึกอัตโนมัติ
ทุกการกระทำของผู้ใช้ที่เปลี่ยนแปลงโมเดลควรคงอยู่ในทันที (หรือผ่านคิวฝั่งไคลเอ็นต์) เช่นหากทำเครื่องหมายในช่องทำเครื่องหมายเปลี่ยนฟิลด์ข้อความหรือลากและวางบางสิ่งเมื่อทำเสร็จแล้วให้ยืนยันการเปลี่ยนแปลง
- อย่างไร? ใช้เฟรมเวิร์ก MV ** (Backbone.js / Knockout.js / Ember.js / Angular.js ฯลฯ ) เพื่อเชื่อมโยงโมเดลและยืนยันการเปลี่ยนแปลง
- ข้อดี : ดูเหมือนว่าโซลูชันที่สะอาดเซสชันจะแอ็คทีฟตราบใดที่ผู้ใช้แอ็คทีฟไม่มีการทำงานด้านไคลเอ็นต์โดยไม่คงอยู่
- ข้อด้อย : ผู้ใช้แอ็คชั่นคนสุดท้ายกำลังทำหลังจากหมดเวลาเซสชันไปแล้ว
4. ล็อกผู้ใช้ออกหลังจากเซสชันหมดอายุ
สิ่งนี้สามารถมีหลายวิธี
ถามเซิร์ฟเวอร์ "หมดอายุเซสชัน" - นี่เป็นบิตของแมวที่ 22 / Schrodinger ที่จับเป็นเพียงคำถามไปยังเซิร์ฟเวอร์ขยายเซสชัน (เริ่มหมดเวลา)
- อย่างไร? อาจมีเซิร์ฟเวอร์ที่รองรับคำถามดังกล่าว (ฉันไม่ทราบ แต่ฉันมาจาก Java land) หรือหนึ่งสามารถเก็บ ID ของเซสชันและเวลาเข้าถึงล่าสุดด้วยตนเองและถามเซิร์ฟเวอร์โดยผ่านเซสชัน ID เป็นพารามิเตอร์แทนที่จะเป็นคุกกี้ฉันไม่แน่ใจว่าสิ่งนี้จะเป็นไปได้หรือไม่ แต่มันฟังดูอันตรายการออกแบบที่ไม่ปลอดภัยและไม่ดีหน้าใด ๆ ทั้งสิ้นล็อกยังคงมีอยู่เมื่อลงชื่อเข้าใช้
- ข้อดี : หากมีการสนับสนุนดั้งเดิมในเซิร์ฟเวอร์ดูเหมือนคำถามที่ชัดเจนและถูกกฎหมาย (ถามว่าผู้ใช้ X ยังมีเซสชันหรือไม่โดยไม่ต้องต่ออายุหากทำ)
- ข้อด้อย : หากเซิร์ฟเวอร์ไม่รองรับ (และอีกครั้งฉันไม่รู้ว่าเซิร์ฟเวอร์หรือกรอบการทำงานใดมีฟังก์ชั่นนี้) การแก้ปัญหามีความเสี่ยงด้านความปลอดภัยอย่างมาก
วิธีแก้ปัญหาหนึ่งที่ฉันได้ยินมาคือมีเซสชั่นสั้น ๆ ที่ฝั่งเซิร์ฟเวอร์และ ping ฝั่งไคลเอ็นต์ที่ยังมีชีวิตอยู่ซึ่งมีจำนวน ping สูงสุด
- อย่างไร? เซสชันสั้น ๆ บนเซิร์ฟเวอร์ไคลเอนต์ส่ง Ping ทุก sessionTimeOut / 2 มีการลองใหม่สูงสุดของ Y
- จุดเด่น : ชนิดของการแก้ไขปัญหารวดเร็วและสกปรก
- ข้อด้อย : รู้สึกเหมือนแฮ็คจัดการเซสชันต่ออายุตัวเองแทนที่จะปล่อยให้เซิร์ฟเวอร์ทำ
จับเวลาฝั่งไคลเอ็นต์
อย่างไร? มีตัวจับเวลาในฝั่งไคลเอ็นต์และซิงค์กับเซิร์ฟเวอร์หนึ่งโดยเริ่มต้นใหม่ในทุกคำขอให้เท่ากับหมดเวลาของเซิร์ฟเวอร์สูงสุดลบด้วยการแพ็ดบางหลังจากผู้ใช้ไม่ได้ส่งคำขอใด ๆ ไปยังเซิร์ฟเวอร์ UI แสดง "เซสชันคือ เกี่ยวกับการหมดเวลาคุณต้องการดำเนินการต่อหรือไม่ " (เหมือนที่คุณมีในธนาคารออนไลน์)
ข้อดี : แก้ไขปัญหา
- ข้อด้อย : ไม่สามารถนึกถึงสิ่งใดได้นอกจากความจำเป็นในการตรวจสอบให้แน่ใจว่าการซิงค์ทำงาน
คำถาม
ฉันอาจจะพลาดอะไรบางอย่างในการวิเคราะห์ข้างต้นอาจมีข้อผิดพลาดบางอย่างที่โง่เขลาและฉันต้องการให้คุณช่วยแก้ไข โซลูชั่นอื่น ๆ ที่ฉันสามารถมีได้สำหรับเรื่องนี้?
now
เป็นอย่างอื่นและการปรับปรุงสนามสุดท้ายของการเข้าถึงด้วย 4.2 ฟังดูเป็นวิธีที่ยอดเยี่ยมในการฆ่าเซิร์ฟเวอร์ของคุณและเพิ่มค่าใช้จ่าย 4.3 สำหรับ Android เมื่อกลับไปที่หน้าจอหลักฉันค่อนข้างแน่ใจว่ากระบวนการหยุดชั่วคราวและอาจรบกวนการจับเวลาของลูกค้าของคุณ