【问题标题】:Django does not delete cookieDjango 不删除 cookie
【发布时间】:2014-10-26 00:08:55
【问题描述】:

我有一个使用自定义身份验证后端 (CoSign) 运行 Django 1.6 的站点。身份验证有效,但要注销,我需要删除 cookie。

这是注销前的 cookie,使用 Firebug:

  • 名称:cookie_name
  • 域:cookie_domain
  • 路径:/
  • 过期:会话
  • 安全性:安全

这是我的注销视图:

from django.contrib.auth.views import logout as django_logout

def logout(request):
    if request.user.is_authenticated():
        response = django_logout(request,
                                 next_page=reverse("logout-confirmation"))
        response.delete_cookie('cookie_name',
                               domain="cookie_domain")
        return response
    else:
        messages.add_message(request,
                             messages.ERROR,
                             "You can't log out if you aren't logged "
                             "in first!")
        return HttpResponseRedirect(reverse("frontpage"))

我的代码中的 cookie_name 和 cookie_domain 与 cookie 的实际名称和域匹配。

这里是注销视图的响应头:

Connection: "close"
Content-Length: "0"
Set-Cookie: "{{ cookie_name }}=; Domain={{ cookie_domain }}; expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/sessionid=25lysb3tzhozv464mrgg08uqz100ur39; expires=Mon, 15-Sep-2014 19:07:22 GMT; httponly; Max-Age=1209600; Path=/"
Vary: "Cookie"

但是,在进入我的注销视图后,cookie 仍然存在!谁能解释一下为什么会发生这种情况?

【问题讨论】:

    标签: django cookies


    【解决方案1】:

    我通过使用手动输入到期日期的set_cookie() 而不是delete_cookie() 解决了这个问题。此外,如果我在 Django 中设置域,它会以句点为前缀,这意味着它与现有的 cookie 不匹配。我没有输入域,它使用了默认值,它有效。

    【讨论】:

      【解决方案2】:

      您没有返回 response 您为删除 cookie 而构造的。相反,您将返回新的 HttpResponseRedirect 对象。这是提供给浏览器的响应。

      不返回 HttpResponseRedirect,而是返回使用 django_logout() 创建的 response

      【讨论】:

      • 我像你说的那样编辑了代码并更新了问题。不幸的是,问题仍然存在!
      • 您能否在您的网络浏览器中提供来自网络选项卡的原始 HTTP 响应输出?最好使用 HTTP 响应标头来取消设置 cookie?可能是某种 cookie 路径问题,或者只是 cookie 名称中的拼写错误。
      • 是的,我添加了它们。我没有发布实际的 cookie 名称和域,但我已经三重检查并且它们匹配。看来 Set-Cookie 标头的路径不止一个。
      • 看起来Set-Cookie 标头损坏?如果我正确读取输出,它会过期等两次。
      • 可能是Path 的问题,这与您使用set_cookie() docs.djangoproject.com/en/dev/ref/request-response/… 时的问题不同
      【解决方案3】:

      您可以通过像这样使 cookie 过期来解决这个问题:

      response = django_logout(request,
                                   next_page=reverse("logout-confirmation"))
      
      response.set_cookie('cookie_name', domain="cookie_domain", max_age_seconds=1)
      
      return response
      

      上面的代码将在一秒钟后使您的 cookie 过期。这将确保在响应到达浏览器之前,'cookie_name' 已经过期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-18
        • 2012-04-29
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 2020-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多