适当的方式发送一个真实性标记与AJAX ..?

这工作,但因为它缺乏一个真实性标记被阻止:

$(".ajax-referral").click(function(){ $.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script"}); return false; }); 

所以我试图像这样添加它:

 $(".ajax-referral").click(function(){ $.ajax({type: "POST", url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, dataType: "script"}); return false; }); 

它正确传递auth_token作为参数,但似乎失去了我的forms的其余部分。

无论如何要完成发送工作的表单数据,以及真实性标记以及?

这是一个铁路环境。 我有这个在我的脑海中。

 = javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery? 

我试过的东西

1。

 = hidden_field :authenticity_token, :value => form_authenticity_token 

2。

 $.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script", authenticity_token: AUTH_TOKEN}); 

3。

 // Always send the authenticity_token with ajax $(document).ajaxSend(function(event, request, settings) { if ( settings.type != 'GET' ) { settings.data = (settings.data ? settings.data + "&" : "") + "authenticity_token=" + encodeURIComponent( AUTH_TOKEN ); } }); 

其实,你正在阅读表单的action属性,并发送一个后Ajax请求。 发送表单数据,你必须提交表单,或者你可以序列化表单数据,并发送一个Ajax请求

 $(".ajax-referral").click(function(){ $.ajax({ type: "POST", url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, data:$(this).parent("form").serialize(), dataType: "script" }); return false; }); 

这样做会将您的表单数据序列化,并将其与ajax请求一起发送,并且已经通过查询string发送了真实性令牌

如果您在顶部具有以下ERB,则默认情况下,该标记也会出现在application.html.erb布局文件头部的“meta”标记之一中:

 <%= csrf_meta_tag %> 

ERB大致呈现给:

 <meta content="abc123blahblahauthenticitytoken" name="csrf-token"> 

然后你可以用下面的代码使用jQuery抓取它:

 var AUTH_TOKEN = $('meta[name=csrf-token]').attr('content'); 

谢谢!

只是为了澄清更常见的用途。

头脑中需要带有var AUTH_TOKEN的js标签。 应该是这样的。

 <%= csrf_meta_tag %> <%= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery? %> 

然后简单地把你的authenticity_token = AUTH_TOKEN放在ajax数据中,如果你不需要使用父(表)或类似的东西。

 $.ajax({ type: 'post', dataType:'text', data: "user_id="+user_id+"&authenticity_token="+AUTH_TOKEN, url:'/follow/unfollow' }) 

感谢上面的人分享这个知识!

直到我通过JS在请求头上设置X-CSRF-Token值之后,这些工作对我来说没有任何作用:

 request.setRequestHeader('X-CSRF-Token', token) 

当然,这是CSRF的标志。 我从<meta name="csrf-token">标记得到了这个,并没有使用encodeURIComponent()

更新,因为这对一些人来说是有用的

总而言之:

 var token = document.querySelector('meta[name="csrf-token"]').content request.setRequestHeader('X-CSRF-Token', token) 

您可以在表单中包含AUTH_TOKEN,作为隐藏的input。

 <input type="hidden" name="AUTH_TOKEN">1234abcd</input> 

我刚刚遇到了这个问题,但我在我的application.js文件中尝试了这种方法:

 $(document).ajaxSend(function(e, xhr, options) { if (options.data == null) { options.data = {}; } options.data['authenticity_token'] = token; }); 

这是我得到这个想法的原始问题: ajaxSend Question

只需使用form_tag自动包含CSRF标记参数。 Rails支持“Unobtrusive Javascript”,意思是表单仍然会通过AJAX提交。 控制器动作支持“respond_to”块,并且您可以使用.js.erb扩展名对网页进行更改以响应表单提交。