Ứng dụng Django của chúng tôi có các yêu cầu quản lý phiên sau.
- 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 thời gian không hoạt động.
- Phát hiện khi một 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 về một phiên sắp hết hạn vài phút trước khi kết thúc khoảng thời gian 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 để kéo dài phiên của họ.
- Nếu người dùng đang thực hiện một hoạt động kinh doanh 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ủ, thì 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 phương pháp triển khai sau đây.
Yêu cầu 1 Yêu cầu
này có thể dễ dàng thực hiện bằng cách đặt SESSION_EXPIRE_AT_BROWSER_CLOSE thành True.
Yêu cầu 2
Tôi đã thấy một số khuyến nghị sử dụng SESSION_COOKIE_AGE để đặt khoảng thời gian hết hạn phiên. Nhưng phương pháp này có những 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 thời hạn phiên thành SESSION_COOKIE_AGE cho mọi yêu cầu sử dụng phần mềm trung gian tùy chỉnh hoặc bằng cách lưu phiên theo 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 thức 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 sẽ hết hạn khi đóng trình duyệt hoặc vào thời gian 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 sẽ được giữ lại và việc 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ần xác thực lại.
Django chỉ dựa vào cookie hiện có để xác định xem phiên có hoạt động hay không. Nó không kiểm tra ngày hết hạn phiên được lưu trữ cùng 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 đề được đề cập ở 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 + thời gian không hoạt động' theo mọi yêu cầu.
- Ghi đè process_request trong SessionMiddleware và kiểm tra thời hạn của 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), hãy đặt một thuộc tính trên yêu cầu để cho biết 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, đưa ra cảnh báo và cũng là một tùy chọn để kéo dài phiên. Nếu người dùng muốn gia hạn, hãy gửi một xung duy trì hoạt động đến máy chủ để kéo dài phiên.
Yêu cầu 5
Sử dụng JavaScript để phát hiện hoạt động của người dùng (trong quá trình hoạt động kinh doanh lâu dài) và gửi các xung còn sống đến máy chủ để ngăn phiên hết hạn.
Phương pháp triển khai ở trên có vẻ rất phức tạp và tôi đã tự hỏi liệu có thể có một phương pháp đơn giản hơn không (đặc biệt là cho Yêu cầu 2).
Bất kỳ hiểu biết sâu sắc sẽ được đánh giá cao.