程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了由于Django中的非活动状态,如何终止会话?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决由于Django中的非活动状态,如何终止会话??

开发过程中遇到由于Django中的非活动状态,如何终止会话?的问题如何解决?下面主要结合日常开发的经验,给出你关于由于Django中的非活动状态,如何终止会话?的解决方法建议,希望对你解决由于Django中的非活动状态,如何终止会话?有所启发或帮助;

这是一个主意…在该SESSION_EXPIRE_AT_BroWSER_CLOSE设置下,关闭浏览器上的会话。然后像这样在每个请求的会话中设置时间戳。

request.session['last_activity'] = datetiR_77_11845@e.Now()

并添加中间件以检测会话是否已过期。这样的事情应该处理整个过程…

from datetiR_77_11845@e import datetiR_77_11845@e
from django.http import httpResponseRedirect

class SessionExpiredMIDdleware:
    def process_request(request):
        last_activity = request.session['last_activity']
        Now = datetiR_77_11845@e.Now()

        if (Now - last_activity).minutes > 10:
            # Do logout / expire session
            # and then...
            return httpResponseRedirect("LOGIN_PAGE_URL")

        if not request.is_AJAX():
            # don't set this for AJAX requests or else your
            # expired session checks will keep the session from
            # expiring :)
            request.session['last_activity'] = Now

然后,你只需要创建一些url和视图即可将有关会话到期的相关数据返回给AJAX调用。

当用户选择“更新”会话时,可以这么说,你要做的只是requeset.session['last_activity']再次设置为当前时间

显然,这段代码只是一个开始……但它应该使你走上正确的道路

解决方法

我们的Django应用程序具有以下会话管理要求。

  1. 当用户关闭浏览器时,会话期满。
  2. 闲置一段时间后,会话将过期。
  3. 检测会话由于不活动而过期的时间,并向用户显示适当的消息。
  4. 在闲置时间结束前几分钟提醒用户即将到期的会话。除了警告,还为用户提供扩展会话的选项。
  5. 如果用户正在应用程序中从事长时间的业务活动,而该业务活动不涉及将请求发送到服务器,则会话不得超时。
    阅读文档,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)。

任何见解将不胜感激。

大佬总结

以上是大佬教程为你收集整理的由于Django中的非活动状态,如何终止会话?全部内容,希望文章能够帮你解决由于Django中的非活动状态,如何终止会话?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。