我用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')
},
当前回答
我使用Rails 4.2.4,不知道为什么我得到:
Can't verify CSRF token authenticity
我在布局中有:
<%= csrf_meta_tags %>
在控制器中:
protect_from_forgery with: :exception
调用tcpdump - a -s 999 -i lo port 3000显示正在设置的报头(尽管不需要用ajaxSetup设置报头-它已经完成了):
X-CSRF-Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
DNT: 1
Content-Length: 125
authenticity_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
最后它失败了,因为我关掉了cookie。如果不启用cookie, CSRF将无法工作,因此如果您看到此错误,这是另一个可能的原因。
其他回答
最好的方法实际上是使用<%= 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) %>"
})
我只是想把这个链接到这里,因为这篇文章有你想要的大部分答案,而且它也非常有趣
http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/
如果有人需要与Uploadify和Rails 3.2相关的帮助(就像我在谷歌这篇文章时一样),这个示例应用程序可能会有帮助: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master/app/views/pictures/index.html.erb
也检查控制器解决方案在这个应用程序
确实是最简单的方法。不要费心更改头文件。
确保你有:
<%= 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);
}
});
哎呀. .
我在我的application.js中漏掉了下面一行
//= require jquery_ujs
我把它换了,它还在工作。
=======更新=========
5年后,我又犯了同样的错误,现在我有了全新的Rails 5.1.6,我又找到了这篇文章。就像生命的循环。
现在的问题是 Rails 5.1默认删除了对jquery和jquery_ujs的支持
//= require rails-ujs in application.js
它做以下事情:
各种操作的强制确认对话框; 从超链接发出非get请求; 使用Ajax使表单或超链接异步提交数据; 在表单提交时自动禁用提交按钮,以防止双击。 (来自https://github.com/rails/rails-ujs/tree/master):
但为什么它不包括csrf令牌ajax请求?如果有人知道这个细节,请评论我。我很感激。
无论如何,我在我的自定义js文件中添加了以下内容以使其工作(感谢其他帮助我实现此代码的答案):
$( document ).ready(function() {
$.ajaxSetup({
headers: {
'X-CSRF-Token': Rails.csrfToken()
}
});
----
----
});