我用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')
},
当前回答
您可以像下面这样全局地编写它。
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'))
}
其他回答
哎呀. .
我在我的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()
}
});
----
----
});
最好的方法实际上是使用<%= 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) %>"
})
如果你没有使用jQuery,而是使用类似于获取API的请求,你可以使用下面的方法来获取csrf-token:
文档。querySelector(“元[name =“csrf-token”]”)。getAttribute(“内容”)
fetch('/users', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content')},
credentials: 'same-origin',
body: JSON.stringify( { id: 1, name: 'some user' } )
})
.then(function(data) {
console.log('request succeeded with JSON response', data)
}).catch(function(error) {
console.log('request failed', error)
})
如果我没记错的话,你必须添加以下代码到你的表单,以摆脱这个问题:
<%= token_tag(nil) %>
不要忘记参数。
使用jquery。csrf (https://github.com/swordray/jquery.csrf)。
Rails 5.1或更高版本 添加jquery.csrf //= require jquery.csrf Rails 5.0或之前版本 来源“https://rails-assets.org”做 宝石的rails-assets-jquery.csrf 结束 //= require jquery.csrf 源代码 (函数(美元){ 美元(文档)。ajaxSend(函数(e, xhr,选项){ var牌= $(“元[name = " csrf-token]”).attr(“内容”); If (token) xhr。setRequestHeader(“X-CSRF-Token”,令牌); }); }) (jQuery);