我有一个表单并使用json数据将其发布到服务器,服务器将其保存在数据库中。这是我的代码
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 ok。所以我在数据库中得到了重复数据。 csrf令牌是否应该防止重复的sumbit?我该如何解决?
答案 0 :(得分:1)
你应该通过适当的照顾来防止双重提交 布置你的脚本执行流程&脚本结构,以防止这种情况。
答案 1 :(得分:0)
不,CSRF令牌不会阻止任何类型的重复提交。它的目的是防止Cross Site Request Forgery,别无其他。它创建了一个令牌,因此没有人可以欺骗您提交您不打算做的请求。
如果要防止重复提交,可以在单击一次后禁用提交按钮。但是,这绝不是一个好的解决方案,因为JavaScript在客户端运行并且可以轻松地进行操作(例如通过Firebug)。因此,重复提交仍然是可能的,但事实并非如此。
更好的方法是在服务器端Python代码中进行验证。您可以检查提交的数据是否已存在于数据库中,如果是,则忽略该请求或者可选地返回错误消息。这确保即使是摆弄JavaScript,一个邪恶的用户也无法保存两次数据。
我会使用这两种方法,第一种方法只是告诉用户他不应该尝试两次提交相同的数据 - 这只是一个界面特权。