2016-08-25 62 views
0

我使用的是Django 1.10。Django AJAX POST登录在IE,EDGE等CSRF错误

我想通过Jquery AJAX登录,但CSRF已设置。

为了通过CSRF检查,我有以下代码(在独立的js文件中)。

/* CSRF-config Start */ 
 
$.ajaxSetup({ 
 
    beforeSend: function(xhr, settings) { 
 
     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; 
 
     } 
 
     if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
 
      // Only send the token to relative URLs i.e. locally. 
 
      xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
 
     } 
 
    } 
 
}); 
 
$(document).ajaxSend(function(event, xhr, settings) { 
 
    if (settings.type == 'POST' || settings.type == 'PUT' || settings.type == 'DELETE') { 
 
     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; 
 
     } 
 
     if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
 
      // Only send the token to relative URLs i.e. locally. 
 
      xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
 
     } 
 
    } 
 
}); 
 
    /* CSRF-config End */

铬完美的作品在这里,登录没有问题。

然而,当我切换到IE,EDGE等发生以下错误:

“””

禁止(CSRF饼干未设置。):/登录/

[25/8/2016 8时58分42秒] “POST /登录/ HTTP/1.1” 403 2857

“””

我的代码似乎根本不工作。 :(

回答

0

在这里!我想出了一个解决方案。

下面的代码应该ONLY模板HTML页面写入

不要把它留给一个独立的JS文件。

在发生冲突时删除其他相关的CSRF AJAXSetup代码

<!-- Bla bla bla your login form, input, etc. --> 
<script> 
    $.ajaxSetup({ 
     data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, 
    }); 
</script> 
0

从Django文档:

如果你的观点并没有渲染包含csrf_token模板标签模板,Django的,还没有设置CSRF令牌的cookie。 Read more...

您可以用两个中的一个解决方案,使用现有的静态JS:

  1. 确保在模板中包括{% csrf_token %}。通常情况下它会以某种形式出现,但是如果您不使用形式,只需将它放在身体的某个位置即可。
  2. 添加@ensure_csrf_cookie修饰符到您的视图功能。

我以前只在IE中遇到这个问题