4

我决定只加载一个页面来实现我的 Rails 站点,并通过 AJAX 完成其他所有操作。问题是生成的 CSRF 令牌meta一旦用于提交注册或登录表单就会失效。如何在不重新加载页面的情况下更新它?

4

3 回答 3

0

在每个 ajax 请求中:

添加到数据:

authenticity_token: '<%= form_authenticity_token %>'

于 2013-03-11T10:56:55.673 回答
0

我不认为 Rails 在每次请求(或发布或其他任何内容)之后都会使 CSRF 元令牌无效(如果没有,像主干.js 这样的框架将很难:)。

https://github.com/rails/rails/blob/7fb99e5743d88c04357e09960d112376428a6faa/actionpack/lib/action_controller/metal/request_forgery_protection.rb#L100

您可能在您认为没有正确令牌的无效请求之前发出请求,因此 rails 会删除您的会话,并且后续请求即使传递了先前正确的令牌,也会被标记为无效。

于 2012-07-04T13:16:50.007 回答
0

您可以在您的 ajax 调用中使用 beforeSend 如下所示的 put、post 方法。 $.ajax({ type: 'POST', beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}, url: your url, data: data });

于 2015-11-23T12:10:42.790 回答