2014-04-16 59 views
1
  • 我有一個頁面可以查看驗證或不驗證。
  • 該頁面包含表格(連同其CSRF令牌)
  • 形式要求通過驗證才能加以考慮
  • 我管理阿賈克斯認證檢查(表單提交)
  • 如果用戶沒有通過驗證,他可以從一個新的窗口(帶鏈接)
  • 一旦通過驗證做到這一點,用戶可以關閉新窗口,並重新提交表單

在這種情況下,Django的告訴我,我的CRSF令牌無效再也沒有Django - CSRF令牌在Ajax登錄後似乎失效

CSRF令牌丟失或不正確

我想那是因爲SESSION_ID已更改,或者類似的東西。

我的斷言是否正確?
我該如何讓用戶重新提交表單而無需重新加載頁面?

回答

3

儘管上述方法可用於AJAX POST請求,但有一些不便之處:您必須記住將CSRF令牌作爲POST數據傳遞給每個POST請求。出於這個原因,還有一種替代方法:在每個XMLHttpRequest上,將自定義X-CSRFToken標頭設置爲CSRF標記的值。這通常更容易,因爲許多javascript框架提供了允許在每個請求上設置標題的鉤子。

您需要通過一個AJAX調用發送CSRF令牌:

$.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')); 
     } 
    } 
}); 

下面是引用鏈接,https://docs.djangoproject.com/en/1.6/ref/contrib/csrf/#ajax

+0

OK !!!!現在我明白了從cookie中發佈CRSF的興趣,而不是從模板的「{%crsf_token%}」 –