由于多个并发请求,Django会话cookie丢失

时间:2011-01-24 14:34:50

标签: python django session cookies

我正在构建一个应用程序,其中客户端不时地ping服务器(让我们不了解原因)。当服务器处理这些请求时,它会使用request.user.is_authenticated()

检查客户端是否已登录

它看起来像这样:

def handle_ping_request(request):
    if request.user.is_authenticated():
       # Do something...
    else:
       # Do Something else...

我注意到有时服务器会立即收到一个登录请求,然后是ping请求(来自同一个用户)。然后,客户端成功登录,响应返回一个新的会话ID(登录用户)和(我猜)旧的会话ID(匿名用户)被删除。处理ping请求时,其请求包含旧的会话ID。因此,ping请求返回第三个会话ID,并且在客户端发出的下一个请求中,客户端不再登录。

我的登录代码如下所示:

if not request.user.is_authenticated():
    user = auth.authenticate(...credentials...)

    if user and user.is_active:
        auth.login(request, user)

您对如何避免此问题有任何建议吗?最好不涉及客户。

感谢。

2 个答案:

答案 0 :(得分:1)

在服务器上处理这个问题可能太麻烦了,因为你必须创建某种信号量系统,它也会尝试猜测当前是否有来自同样经过身份验证的客户端的ping。我的建议只是在等待对其登录请求的响应时更改客户端代码而不是ping。

答案 1 :(得分:0)

您可以通过使用不生成新密钥的自定义身份验证后端,或通过创建一个新密钥来创建标准contrib.auth.login method的替代方案,以保留相同的会话ID,而不是生成新的会话ID。自定义会话后端,它会覆盖cycle_key() method in contrib.sessions.base以重用相同的密钥。

但是:通过重用相同的会话密钥来考虑你可能会打开自己的东西 - 取决于这个系统在哪里使用,你会让自己对会话劫持更​​加开放(即:只有一个会话ID嗅探),以及缓存可能返回unauth页面内容而不是auth页面内容的潜在问题,因为sessionid在技术上是相同的,并且缓存无法区分两种情况等等,等等。

简而言之:默认情况下,它的工作原理是它的工作方式。