2016-08-25 13 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中遇到這個問題