我们的 Django 应用程序具有以下会话管理需求。
在阅读了相关的文档、 Django 代码和一些博客文章之后,我提出了以下实现方法。
要求1
通过将 SESSION _ EXPIRE _ AT _ BROWSER _ CLOSE 设置为 True,这个需求很容易实现。
要求2
我看到了一些使用 SESSION _ COOKIE _ AGE 来设置会话有效期的建议。但这种方法存在以下问题。
即使用户正在积极使用应用程序,会话也总是在 SESSION _ COOKIE _ AGE 结束时到期。(可以通过使用自定义中间件将每个请求的会话到期时间设置为 SESSION _ COOKIE _ AGE,或者通过将 SESSION _ SAVE _ EVY _ REQUEST 设置为 true 将每个请求的会话保存为 true 来防止这种情况。但是由于使用了 SESSION _ COOKIE _ AGE,下一个问题是不可避免的。)
由于 cookie 的工作方式,SESSION _ EXPIRE _ AT _ BROWSER _ CLOSE 和 SESSION _ COOKIE _ AGE 是相互排斥的,也就是说,cookie 要么在浏览器关闭时过期,要么在指定的过期时间过期。如果使用 SESSION _ COOKIE _ AGE,并且用户在 cookie 过期之前关闭浏览器,那么 cookie 将被保留,并且重新打开浏览器将允许用户(或任何其他人)进入系统,而无需重新验证身份。
Django 仅依赖于存在的 cookie 来确定会话是否处于活动状态。它不检查与会话一起存储的会话到期日期。
下面的方法可以用来实现这个需求并解决上面提到的问题。
要求3
当我们检测到会话已过期(在上面的自定义 SessionMiddleware 中)时,在请求上设置一个属性以指示会话过期。此属性可用于向用户显示适当的消息。
要求4
使用 JavaScript 检测用户不活跃,提供警告,并提供扩展会话的选项。如果用户希望扩展,请向服务器发送一个 keep alive 脉冲以扩展会话。
要求5
使用 JavaScript 检测用户活动(在长期业务操作期间)并向服务器发送保持活动的脉冲,以防止会话过期。
上面的实现方法看起来非常复杂,我想知道是否有更简单的方法(特别是对于需求2)。
任何见解都将受到高度赞赏。