我们的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