我做了一个带登录表单的模态,并通过POST AJAX请求提交。我只能登录一次,当我退出并尝试再次登录时,AJAX请求的错误消息是(CSRF失败):
Prohibido (403)
Verificación CSRF fallida. Solicitud abortada
如果按F5刷新整个页面,则只能再次登录。登录成功后,我只刷新标题,而不是整个页面。我的刷新代码是这样的:
$('#update-' + idToUpdate).load(' #' + idToUpdate);
修改 我发现CSRF令牌仅在成功请求后工作一次。我必须为表单生成一个新的令牌才能再次工作,如果我按F5刷新整个页面,这个令牌只会得到更新,这就是我不想做的事情。
针对此问题的任何解决方案?我不想做AJAX请求来更新CSRF令牌,这是不安全的。
答案 0 :(得分:0)
我找到了解决方案。在成功请求后,在我的函数$('#update-' + idToUpdate).load(' #' + idToUpdate);
中插入带有CSRF令牌的表单的所有ID。这会对表单执行部分异步F5刷新,因此所有CSRF令牌都会得到更新,我可以执行新请求。
答案 1 :(得分:0)
您可以通过JS本身生成CSRF令牌:
// using jQuery
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
每次调用该函数时,都会创建一个新的CSRF令牌,但您不需要刷新页面。
有关详细信息,请查看:https://docs.djangoproject.com/en/1.11/ref/csrf/#ajax