我们的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)。
任何见解将不胜感激。