Rails 3.1 - CSRF被忽略了?

K'a*_*'ao 10 jquery csrf ruby-on-rails-3.1

这是我的问题,

我有一个rails 3.1应用程序,我正在尝试发出ajax请求,但是我收到警告消息"警告:无法验证CSRF令牌真实性"...

在我的布局中,我有辅助方法"csrf_method_tag",我添加了以下javascript代码(不知道是否真的需要):

$.ajaxSetup({
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
  }
});
Run Code Online (Sandbox Code Playgroud)

我的Gemfile包含gem jquery-rails(> = 1.0.12),我需要在我的application.js顶部使用jquery和jquery-ujs.

即使这样,该消息仍然出现.我忘记了什么吗?

谢谢你的帮助.

小智 9

我遇到了同样的麻烦.我试图抓住一个javascript事件(you_tube播放器完成)和Ajax回到我的服务器让我知道.我得到了:

WARNING: Can't verify CSRF token authenticity

每当jQuery ajax调用命中我的服务器.我在上面添加了你的代码修复

$.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('X-CSRF-Token',
                             $('meta[name="csrf-token"]').attr('content'));
    }
});
Run Code Online (Sandbox Code Playgroud)

它工作正常.我认为唯一的区别在于我的布局

<%= csrf_meta_tags %>
Run Code Online (Sandbox Code Playgroud)

而不是你在原帖中提到的csrf_method_tag.
所以,谢谢你的修复,它是在原始帖子中.

  • **请_don't_在帖子中使用签名或标语.**阅读[FAQ条目](http://stackoverflow.com/faq#signatures)了解更多信息.谢谢! (2认同)

Dyl*_*kow 7

您可能甚至不需要在代码中使用它.jquery-rails默认情况下,gem会自动在所有Ajax请求上设置CSRF令牌.


小智 7

什么对我有用 - 当没有表格工作时 - 是将结果包含<%= form_authenticity_token %>在ajax数据有效载荷中.所以我做的事情就像tehprofessor在html中建议的那样:

<input id="tokentag" type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>" />
Run Code Online (Sandbox Code Playgroud)

然后在javascript中:

tokentag = $('#tokentag').val()
submitdata = { "authenticity_token": tokentag, ...+whatever else you need to include+...}
Run Code Online (Sandbox Code Playgroud)

然后调用$.ajaxsubmitdata.