我用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')
},
当前回答
确保在布局中有<%= csrf_meta_tag %> 添加beforeSend在ajax请求中包含csrf-令牌,以设置头部。这只需要post请求。
读取csrf-token的代码在rails/jquery-ujs中可用,所以以我之见,使用它是最简单的,如下所示:
$.ajax({
url: url,
method: 'post',
beforeSend: $.rails.CSRFProtection,
data: {
// ...
}
})
其他回答
最好的方法实际上是使用<%= form_authenticity_token。To_s %>直接在rails代码中打印令牌。你不需要像其他文章提到的那样使用javascript来搜索dom中的csrf令牌。只需添加标题选项如下;
$.ajax({
type: 'post',
data: $(this).sortable('serialize'),
headers: {
'X-CSRF-Token': '<%= form_authenticity_token.to_s %>'
},
complete: function(request){},
url: "<%= sort_widget_images_path(@widget) %>"
})
从一个旧的应用程序升级到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请求时都被重置。添加上面的代码解决了这个问题。
确实是最简单的方法。不要费心更改头文件。
确保你有:
<%= csrf_meta_tag %> in your layouts/application.html.erb
只需要像这样做一个隐藏的输入字段:
<input name="authenticity_token"
type="hidden"
value="<%= form_authenticity_token %>"/>
或者如果你想要一个jQuery ajax的帖子:
$.ajax({
type: 'POST',
url: "<%= someregistration_path %>",
data: { "firstname": "text_data_1", "last_name": "text_data2", "authenticity_token": "<%= form_authenticity_token %>" },
error: function( xhr ){
alert("ERROR ON SUBMIT");
},
success: function( data ){
//data response can contain what we want here...
console.log("SUCCESS, data="+data);
}
});
如果你使用javascript和jQuery在你的表单中生成令牌,这是有效的:
<input name="authenticity_token"
type="hidden"
value="<%= $('meta[name=csrf-token]').attr('content') %>" />
显然,您需要在Ruby布局中使用<%= csrf_meta_tag %>。
对于那些需要非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();