jor*_*llo 5 django cookies session
我们最近将我们的Cookie域名(settings.SESSION_COOKIE_DOMAIN)从domain.com更改为.domain.com,现在这阻止了Safari用户登录,除非他们清除了Cookie.问题在于为两个域设置了sessionid cookie.
有没有办法清除或忽略原始域或是建议用户清除cookie的唯一方法?
SESSION_COOKIE_DOMAIN修改设置时可能会发生这种情况.(你声明SESSION_COOKE_PATH已经改变了).
SESSION_COOKIE_DOMAIN随附此警告的文档:
SESSION_COOKIE_DOMAIN
在生产站点上更新此设置时要小心.如果更新此设置以在以前使用标准域cookie的站点上启用跨域cookie,则现有用户cookie将设置为旧域.这可能导致只要这些cookie持续存在就无法登录.
如果你从以下地方出现这种情况:
SESSION_COOKIE_DOMAIN = None
Run Code Online (Sandbox Code Playgroud)
至
SESSION_COOKIE_DOMAIN = '.domain.com'
Run Code Online (Sandbox Code Playgroud)
如您所述,客户端现在有两个cookie,它们将在请求期间发送到服务器,并且两个cookie都被命名sessionid.当Django查看cookie时,它只能访问Python字典,所以它只能看到一个sessionidcookie而不是两个cookie.
我没有对此进行测试,但解决问题的一些想法可能是:
要求用户删除相应的cookie.根据用户数量及其技能水平,这可能不是一个合理的选择.要求他们删除所有他们的cookie可能是不可能的.
等待旧cookie过期.默认情况下,sessionidcookie似乎有14天的到期时间.旧会话cookie过期后,将不再随每个请求一起发送,允许新sessionidcookie生效.
更改sessionidcookie 的名称并编写自定义Django中间件来处理新旧sessionidcookie.
我没有测试过最后一点,但应该可以将其更改SESSION_COOKIE_NAME为其他内容sessionid.现在,这将阻止现有登录用户使用他们现有的sessionidcookie,因此您需要编写一个自定义中间件,它能够处理sessionidcookie(对于旧cookie)和sessionidnew当前登录的cookie.
这样的东西会起作用:
from django.utils.importlib import import_module
from django.contrib.sessions import middleware
from django.conf import settings
class MySessionMiddleware(middleware.SessionMiddleware):
def process_request(self, request):
engine = import_module(settings.SESSION_ENGINE)
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
if session_key is None:
# Look for old cookie in request for auth purposes.
session_key = request.COOKIES.get('sessionid', None)
request.session = engine.SessionStore(session_key)
Run Code Online (Sandbox Code Playgroud)
你必须更换SessionMiddleware在settings.py根据MIDDLEWARE_CLASSES这个新的中间件.例如:更改'django.contrib.sessions.middleware.SessionMiddleware'为'custommiddleware.MySessionMiddleware'custommiddleware.py是具有上述代码的文件,并且存在于项目根文件夹中(其中存在manage.py文件)
一旦经过足够的时间并且您对所有旧sessionidcookie已过期感到满意,您可以反过来并改回使用sessionid作为会话的首选cookie名称,最终删除可处理两种不同类型sessionidcookie 的专业代码.
| 归档时间: |
|
| 查看次数: |
1497 次 |
| 最近记录: |