我用AJAXand发送数据从视图到控制器,我得到了这个错误:
警告:无法验证CSRF令牌的真实性
我想我必须用数据发送这个令牌。
有人知道我该怎么做吗?
编辑:我的解决方案
我通过在AJAX帖子中放入以下代码来做到这一点:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
我用AJAXand发送数据从视图到控制器,我得到了这个错误:
警告:无法验证CSRF令牌的真实性
我想我必须用数据发送这个令牌。
有人知道我该怎么做吗?
编辑:我的解决方案
我通过在AJAX帖子中放入以下代码来做到这一点:
headers: {
'X-Transaction': 'POST Example',
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},
当前回答
对于那些需要非jQuery答案的人,您可以简单地添加以下内容:
xmlhttp.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
这里有一个非常简单的例子:
xmlhttp.open("POST","example.html",true); xmlhttp.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); xmlhttp.send();
其他回答
你应该这样做:
确保在布局中有<%= csrf_meta_tag %> 添加beforeSend到所有ajax请求来设置头部,如下所示:
$.ajax({ url: 'YOUR URL HERE',
type: 'POST',
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
data: 'someData=' + someData,
success: function(response) {
$('#someDiv').html(response);
}
});
在所有请求中发送令牌,您可以使用:
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
}
});
从一个旧的应用程序升级到rails 3.1,包括csrf元标记仍然不能解决这个问题。在rubyonrails.org的博客上,他们给出了一些升级技巧,特别是这一行jquery应该放在布局的头部部分:
$(document).ajaxSend(function(e, xhr, options) {
var token = $("meta[name='csrf-token']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", token);
});
摘自这篇博客:http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails。
在我的例子中,会话在每次ajax请求时都被重置。添加上面的代码解决了这个问题。
您可以像下面这样全局地编写它。
JS:正常
$(function(){
$('#loader').hide()
$(document).ajaxStart(function() {
$('#loader').show();
})
$(document).ajaxError(function() {
alert("Something went wrong...")
$('#loader').hide();
})
$(document).ajaxStop(function() {
$('#loader').hide();
});
$.ajaxSetup({
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}
});
});
咖啡脚本:
$('#loader').hide()
$(document).ajaxStart ->
$('#loader').show()
$(document).ajaxError ->
alert("Something went wrong...")
$('#loader').hide()
$(document).ajaxStop ->
$('#loader').hide()
$.ajaxSetup {
beforeSend: (xhr) ->
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
}
我只是想把这个链接到这里,因为这篇文章有你想要的大部分答案,而且它也非常有趣
http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/
对于那些需要非jQuery答案的人,您可以简单地添加以下内容:
xmlhttp.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
这里有一个非常简单的例子:
xmlhttp.open("POST","example.html",true); xmlhttp.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); xmlhttp.send();