AJAX只能运行一次

时间:2017-08-20 01:19:57

标签: jquery ajax django

我做了一个带登录表单的模态,并通过POST AJAX请求提交。我只能登录一次,当我退出并尝试再次登录时,AJAX请求的错误消息是(CSRF失败)

Prohibido (403)
Verificación CSRF fallida. Solicitud abortada

如果按F5刷新整个页面,则只能再次登录。登录成功后,我只刷新标题,而不是整个页面。我的刷新代码是这样的:

$('#update-' + idToUpdate).load(' #' + idToUpdate);

修改 我发现CSRF令牌仅在成功请求后工作一次。我必须为表单生成一个新的令牌才能再次工作,如果我按F5刷新整个页面,这个令牌只会得到更新,这就是我不想做的事情。

针对此问题的任何解决方案?我不想做AJAX请求来更新CSRF令牌,这是不安全的。

2 个答案:

答案 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