Ứng dụng Django của chúng tôi có các yêu cầu quản lý phiên sau đây.Làm thế nào để hết hạn phiên do không hoạt động trong Django?
- Phiên hết hạn khi người dùng đóng trình duyệt.
- Phiên hết hạn sau một khoảng thời gian không hoạt động.
- Phát hiện khi phiên hết hạn do không hoạt động và hiển thị thông báo thích hợp cho người dùng.
- Cảnh báo người dùng phiên sắp xảy ra hết hạn sau vài phút trước khi kết thúc giai đoạn không hoạt động. Cùng với cảnh báo, cung cấp cho người dùng một tùy chọn để mở rộng phiên của họ.
- Nếu người dùng đang làm việc trên một hoạt động kinh doanh lâu dài trong ứng dụng không liên quan đến các yêu cầu được gửi đến máy chủ, phiên không được hết thời gian chờ.
Sau khi đọc tài liệu, mã Django và một số bài đăng trên blog liên quan đến điều này, tôi đã đưa ra cách tiếp cận triển khai sau.
Yêu cầu 1
Yêu cầu này có thể dễ dàng thực hiện bằng cách thiết lập SESSION_EXPIRE_AT_BROWSER_CLOSE True.
Yêu cầu 2
Tôi đã thấy một vài khuyến nghị sử dụng SESSION_COOKIE_AGE để thiết lập các phiên thời gian hết hạn. Nhưng phương pháp này có các vấn đề sau.
Phiên luôn hết hạn vào cuối SESSION_COOKIE_AGE ngay cả khi người dùng đang sử dụng ứng dụng. (Điều này có thể được ngăn chặn bằng cách đặt hết hạn phiên thành SESSION_COOKIE_AGE theo mọi yêu cầu bằng cách sử dụng phần mềm trung gian tùy chỉnh hoặc bằng cách lưu phiên trên mọi yêu cầu bằng cách đặt SESSION_SAVE_EVERY_REQUEST thành true. Nhưng vấn đề tiếp theo là không thể tránh khỏi do việc sử dụng SESSION_COOKIE_AGE.)
Do cách hoạt động của cookie, SESSION_EXPIRE_AT_BROWSER_CLOSE và SESSION_COOKIE_AGE loại trừ lẫn nhau tức là cookie hết hạn trên trình duyệt đóng hoặc vào thời điểm hết hạn được chỉ định. Nếu SESSION_COOKIE_AGE được sử dụng và người dùng đóng trình duyệt trước khi cookie hết hạn, cookie được giữ lại và mở lại trình duyệt sẽ cho phép người dùng (hoặc bất kỳ ai khác) vào hệ thống mà không được xác thực lại.
Django chỉ dựa vào cookie có mặt để xác định xem phiên có đang hoạt động hay không. Nó không kiểm tra ngày hết hạn phiên được lưu trữ với phiên.
Phương pháp sau có thể được sử dụng để thực hiện yêu cầu này và giải quyết các vấn đề nêu trên.
- Không đặt SESSION_COOKIE_AGE.
- Đặt ngày hết hạn của phiên là 'thời gian hiện tại + khoảng thời gian không hoạt động' trên mọi yêu cầu.
- Ghi đè lên process_request trong SessionMiddleware và kiểm tra hết hạn phiên. Hủy phiên nếu nó đã hết hạn.
Yêu cầu 3
Khi chúng tôi phát hiện rằng phiên đã hết hạn (trong SessionMiddleware tùy chỉnh ở trên), thiết lập một thuộc tính theo yêu cầu để chỉ phiên hết hạn. Thuộc tính này có thể được sử dụng để hiển thị một thông báo thích hợp cho người dùng.
Yêu cầu 4
Sử dụng JavaScript để phát hiện người dùng không hoạt động, cung cấp cảnh báo và cũng là tùy chọn để kéo dài phiên. Nếu người dùng muốn mở rộng, hãy gửi một xung tiếp tục tới máy chủ để mở rộng phiên.
Yêu cầu 5
Sử dụng JavaScript để phát hiện hoạt động người dùng (trong hoạt động kinh doanh lâu) và gửi giữ xung còn sống đến máy chủ để ngăn chặn phiên từ đáo hạn.
Cách tiếp cận triển khai ở trên dường như rất phức tạp và tôi tự hỏi liệu có phương pháp đơn giản hơn (đặc biệt là Yêu cầu 2).
Mọi thông tin chi tiết sẽ được đánh giá cao.
+1 để cung cấp giải pháp chi tiết – Don
"Do cách hoạt động của cookie, SESSION_EXPIRE_AT_BROWSER_CLOSE và SESSION_COOKIE_AGE loại trừ lẫn nhau tức là cookie hết hạn trên trình duyệt hoặc vào thời điểm hết hạn đã chỉ định. Nếu SESSION_COOKIE_AGE được sử dụng và người dùng đóng trình duyệt trước khi cookie hết hạn, cookie được giữ lại và mở lại trình duyệt sẽ cho phép người dùng (hoặc bất kỳ ai khác) vào hệ thống mà không được xác thực lại. " Đúng tôi nếu tôi sai, nhưng điều này dường như không còn đúng trong phiên bản Django mới hơn? (1.5+ ít nhất) –
Có một phần mềm trung gian có thể làm những gì bạn cần. [trên github] (https://github.com/subhranath/django-session-idle-timeout) và [trên pypi] (http://pypi.python.org/pypi/django-session-idle-timeout/1.3 .1) – gbutler