【问题标题】:Loading CSRF token on rails with AJAX使用 AJAX 在 Rails 上加载 CSRF 令牌
【发布时间】:2012-05-28 12:28:17
【问题描述】:

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

【问题讨论】:

  • 使用getElementByIdgetElementsByTagName 操作META 标签有什么问题?
  • 如果我在注册前和注册后使用相同的,它会拒绝 CSRF 令牌。我想知道如何在不重新加载整个页面的情况下更新令牌。

标签: javascript ruby-on-rails ajax ruby-on-rails-3 csrf


【解决方案1】:

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

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

您可能在您认为是 invalid 的请求之前提出了一个请求,但没有正确的令牌,因此 rails 会删除您的会话,并且后续请求即使通过了先前正确的请求也会被标记为无效令牌。

【讨论】:

  • 对,如果我想在不刷新页面的情况下发出多个请求(表单提交),那会是什么样子?
【解决方案2】:

在每个 ajax 请求中:

添加到数据:

authenticity_token: ''

【讨论】:

    【解决方案3】:

    你可以在你的 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 });

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 2014-04-13
      • 2018-02-22
      • 2011-06-13
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 2019-01-13
      相关资源
      最近更新 更多