如何由於 Django 中的不活動而使會話過期?

| | | | | | | | | | | | | | | | | |

我們的 Django 應用程序具有以下會話管理要求。

  1. 會話在用戶關閉瀏覽器時過期。
  2. 會話在一段時間不活動後過期。
  3. 檢測會話何時因不活動而到期並向用戶顯示適當的消息。
  4. 在不活動期結束前幾分鐘警告用戶即將到期的會話。除警告外,還為用戶提供延長會話的選項。
  5. 如果用戶在應用內處理不涉及向服務器發送請求的長時間業務活動,則會話不得超時.

在閱讀了文檔、Django代碼和一些與此相關的博文後,我想出了以下實現方法。

需求1< /strong>
通過將 SESSION_EXPIRE_AT_BROWSER_CLOSE 設置為 True 可以輕鬆實現此要求。

要求 2
我看到了一些使用 SESSION_COOKIE_AGE 設置會話到期的建議期間。但是這種方法存在以下問題。

  • 即使用戶正在積極使用應用程序,會話總是在 SESSION_COOKIE_AGE 結束時過期。(這可以通過設置來防止會話到期到 SESSION_COOKIE_AGE 的每個請求使用自定義中間件或通過設置保存每個請求的會話SESSION_SAVE_EVERY_REQUEST 為真。但是由於使用了 SESSION_COOKIE_AGE,下一個問題是不可避免的。)

  • 由於 cookie 的工作方式,SESSION_EXPIRE_AT_BROWSER_CLOSE 和 SESSION_COOKIE_AGE 是互斥的,即 cookie 要么在瀏覽器關閉時過期,要么在指定的到期時間。如果使用了 SESSION_COOKIE_AGE 並且用戶在 cookie 過期之前關閉了瀏覽器,則 cookie 被保留並重新打開瀏覽器將允許用戶(或其他任何人)進入系統而無需重新驗證。

  • Django 僅依靠存在的 cookie 來確定會話是否處於活動狀態。它不會檢查與會話一起存儲的會話到期日期。

可以使用以下方法來實現此要求並解決上述問題。

  • 不要設置 SESSION_COOKIE_AGE。
  • 在每個請求上將會話的到期日期設置為“當前時間 + 不活動期”。
  • 覆蓋 SessionMiddleware 中的 process_request並檢查會話是否過期。如果會話過期,則丟棄它。

要求 3
當我們檢測到會話已過期時(在自定義 SessionMiddleware上面),在請求上設置一個屬性以指示會話到期。該屬性可用於向用戶顯示適當的消息。

要求 4
使用 JavaScript 來檢測用戶不活動,提供警告以及延長會話的選項。如果用戶希望延長,向服務器發送保持活動脈衝以延長會話。

要求t 5
使用 JavaScript 檢測用戶活動(在長時間的業務操作期間)並向服務器發送保持活動脈衝以防止會話過期。


上述實現方法看起來很複雜,我想知道是否有更簡單的方法(特別是對於要求 2)。

任何見解都將受到高度讚賞。