如何在 django 中查找会话是不是已过期

Posted

技术标签:

【中文标题】如何在 django 中查找会话是不是已过期【英文标题】:how to find if session has expired in django如何在 django 中查找会话是否已过期 【发布时间】:2018-09-22 11:26:18 【问题描述】:

我必须编写这个场景的代码:

一些用户来填写表格,当用户填写表格时,会话过期; 用户尝试提交表单,因为会话已过期,它将带他到登录页面,之后他被重定向到表单页面,其中预先填写了他之前填写的数据。

我提出的解决方案: 在表单提交时,检查用户会话是否通过 ajax 调用过期,如果是,则删除一个带有已填写表单值的 cookie,用户返回相同的表单,从 cookie 值预填充表单。

我走了多远: 不多;我使用 ajax 调用来检查会话过期,并通过后端调用此函数:

def check_valid_session(request):
    session_expiry_date = request.session.get_expiry_date()
    now = datetime.now()
    seconds_left = (session_expiry_date - now).total_seconds()
    if seconds_left <= 0:
        return JsonResponse('session_expired': True, 'seconds_left': seconds_left )
    else:
        return JsonResponse('session_expired':False, 'seconds_left': seconds_left)

在我的设置中:

SESSION_COOKIE_NAME = "sso-sessionid"
SESSION_COOKIE_HTTPONLY = False
SESSION_COOKIE_AGE = 10 
SESSION_COOKIE_DOMAIN = '.mydomain.com'
SESSION_COOKIE_SECURE = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True

但作为回应,我总是得到 seconds_left 接近 9.999。 每次我点击提交并调用上面的后端代码时,session_expiry_date 都会自行增加 10 秒。 如何获得正确的会话过期时间?任何替代方法?

【问题讨论】:

您知道如何查找会话是否已过期吗? request.session.get_expiry_age() - 实际上并没有返回会话到期前还剩多少秒。它只给出我们在 request.session.set_expiry(10) 中设置的内容。 【参考方案1】:

你可以尝试设置

SESSION_SAVE_EVERY_REQUEST = True

每个请求都会将会话保存到数据库中。此外,cookie 将随每个请求一起发送。

【讨论】:

【参考方案2】:

因此,这里发生的情况是,对您的 check_valid_session 视图的连续请求正在将 cookie 的年龄从上次请求刷新到 10 秒。在您的情况下,cookie 只会在自上次请求后 10 秒后过期。

因为您必须发出请求以使 cookie 过期,所以每次都会返回接近 10 的值。

关于如果会话已过期,使用 cookie 保存用户数据的问题。如果没有会话数据,您如何知道是哪个用户发出请求?我能想到的唯一你能做的就是以某种方式保存他们的帖子数据及其相关的 IP 地址。虽然这肯定会使问题过于复杂,并且从安全角度来看也不是很好,因为如果其他用户使用相同的 ip 发出请求,他们可能会看到此帖子数据。

最简单的解决方案是增加会话的超时时间。 10 秒非常短,SESSION_COOKIE_AGE 的默认值为 1209600(2 周,以秒为单位)

【讨论】:

以上是关于如何在 django 中查找会话是不是已过期的主要内容,如果未能解决你的问题,请参考以下文章

如何由于 Django 中的不活动而使会话过期?

如何在 5 分钟内使 Django 会话过期?

如何在我的登录页面中禁用“Laravel 中的会话已过期”?

如何在 Quickblox iOS SDK 中检查会话是不是有效或过期?

如何在 django 中关闭浏览器上的会话

如何查找特定用户的 django 会话?