如何延长Django CSRF令牌有效期?设置SESSION_COOKIE_AGE无效
解决Django CSRF令牌超时问题
你修改SESSION_COOKIE_AGE无效的核心原因是:CSRF令牌的有效期由**CSRF_COOKIE_AGE**单独控制,与会话cookie的有效期是两个独立的配置项。Django默认的CSRF_COOKIE_AGE为3600秒(1小时),这就是页面闲置数小时后提交表单触发403错误的直接原因。
正确配置方法
在settings.py中添加或修改以下配置,将CSRF cookie的有效期延长至目标时长(例如7天):
CSRF_COOKIE_AGE = 604800 # 7天,单位为秒
额外注意事项
- 确认
django.middleware.csrf.CsrfViewMiddleware中间件已在你的MIDDLEWARE列表中启用,这是CSRF保护机制生效的基础。 - 如果页面存在静态缓存(如CDN缓存),缓存页面会包含过期的CSRF令牌,此时需要在表单提交前通过JavaScript动态获取最新令牌:
// 获取最新CSRF令牌的示例(适配Django默认cookie规则) function getCookie(name) { let cookieValue = null; if (document.cookie && document.cookie !== '') { const cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { const cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } const csrftoken = getCookie('csrftoken'); // 提交表单时携带该最新令牌 - 检查浏览器隐私设置,确保未开启自动清除该站点cookie的规则,否则即使后端设置了长期有效期,浏览器也可能提前删除CSRF cookie。
内容的提问来源于stack exchange,提问作者ar2015
相关产品推荐
相关产品推荐

