2012-11-15 69 views
0

我有一個表單,並將其張貼到服務器使用json數據,並將其保存在數據庫中。這裏是我的代碼django csrf在ajax不工作

function saveChanges() { 
    var items = []; 
    $('ol.item_list > li.item').each(function(){ 
     items.push(getItemData($(this))); 
    }); 

    var csrftoken = $.cookie('csrftoken'); 
    $.ajax({ 
     url : '', 
     type: 'POST', 
     headers : {"X-CSRFToken": csrftoken}, 
     data : $.toJSON(items), 
     success: function(data, textStatus, jqXHR){ 
      console.log(data); 
     }, 
     error: function(jqXHR, textStatus, errorThrown){ 
      alert(textStatus); 
     }, 
    }); 

} 

問題是,我打電話saveChanges(通過按鈕)兩次,所有返回200 http確定。所以我得到了數據庫中的重複數據。 csrf令牌是否應該避免重複sumbit?我該如何解決它?

回答

0

不,CSRF令牌不會阻止任何類型的重複提交。其目的是防止Cross Site Request Forgery,沒有別的。它會創建一個令牌,以便任何人都無法欺騙您提交您不打算執行的請求。

如果你想防止重複提交,一種方法是在點擊一次後禁用提交按鈕。然而,這絕不是一個好的解決方案,因爲JavaScript運行在客戶端並且可以很容易地被操縱(例如通過Firebug)。所以重複提交仍然是可能的,只是沒有那麼明顯。

更好的方法是在服務器端Python代碼中進行驗證。您可以檢查提交的數據是否已經存在於數據庫中,如果是,則忽略該請求或可選地返回錯誤消息。這可以確保即使通過擺弄JavaScript,惡意用戶也不能兩次保存數據。

我會使用這兩種方法,第一種方法只是告訴用戶他不應該嘗試兩次提交相同的數據 - 這只是一個界面特權。

1

你應該防止雙重提交妥善保管 佈置你的腳本執行流程&腳本結構,以防止這種情況發生。