适当的方式发送一个真实性标记与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扩展名对网页进行更改以响应表单提交。