我們的Django應用程序具有以下會話管理要求。由於在Django中處於非活動狀態,如何過期會話?
- 當用戶關閉瀏覽器時會話過期。
- 會話在一段時間不活動後過期。
- 檢測會話何時因不活動而到期並向用戶顯示適當的消息。
- 在閒置期結束前幾分鐘向即將到期的會話過期的用戶發出警告。隨着警告,爲用戶提供延長會話的選項。
- 如果用戶正在處理應用程序中不涉及向服務器發送的請求的長時間業務活動,則該會話不得超時。
在閱讀文檔,Django代碼和一些與此相關的博客文章後,我提出了以下實現方法。
要求1
這一要求很容易地通過設置SESSION_EXPIRE_AT_BROWSER_CLOSE爲True實現。
要求2
我已經看到了一些建議使用SESSION_COOKIE_AGE設置會話到期時間。但是這種方法有以下問題。
即使用戶正在使用該應用程序,該會話也始終在SESSION_COOKIE_AGE結束時到期。 (這可以通過使用自定義中間件將會話過期設置爲SESSION_COOKIE_AGE來防止,或者通過將SESSION_SAVE_EVERY_REQUEST設置爲true來保存每個請求上的會話,但由於使用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來檢測用戶的活動,提供警告並延長會話的選項。如果用戶希望擴展,則向服務器發送保活脈衝以延長會話。
要求5
使用JavaScript來檢測用戶活動(長期的業務運營中),併發送永葆脈衝到服務器,以防止過期會話。
上面的實現方法看起來非常複雜,我想知道是否有更簡單的方法(特別是對於需求2)。
任何見解將不勝感激。
+1用於提供詳細的解決方案 – Don 2012-06-07 15:55:52
「由於Cookie的工作方式,SESSION_EXPIRE_AT_BROWSER_CLOSE和SESSION_COOKIE_AGE是互斥的,即cookie在到瀏覽器關閉時或在指定的到期時間到期,如果使用SESSION_COOKIE_AGE且用戶關閉瀏覽器在cookie過期之前,Cookie將被保留,並且重新打開瀏覽器將允許用戶(或任何其他人)進入系統而不需要重新進行身份驗證。「糾正我,如果我錯了,但在新的Django版本中,這似乎不再是真的嗎? (至少1.5+) – 2014-11-04 12:53:26
有一箇中間件可以做你需要的東西。 [在github上](https://github.com/subhranath/django-session-idle-timeout)和[在pypi上](http://pypi.python.org/pypi/django-session-idle-timeout/1.3 .1) – gbutler 2013-02-12 22:50:32