使用 AJAX 在 Rails 上加载 CSRF 令牌
Posted
技术标签:
【中文标题】使用 AJAX 在 Rails 上加载 CSRF 令牌【英文标题】:Loading CSRF token on rails with AJAX 【发布时间】:2012-05-28 12:28:17 【问题描述】:我决定只加载一个页面来实现我的 Rails 站点,并通过 AJAX 完成其他所有工作。问题是meta
中生成的 CSRF 令牌一旦用于提交注册或登录表单就会失效。如何在不重新加载页面的情况下更新它?
【问题讨论】:
使用getElementById
或getElementsByTagName
操作META
标签有什么问题?
如果我在注册前和注册后使用相同的,它会拒绝 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
);
【讨论】:
以上是关于使用 AJAX 在 Rails 上加载 CSRF 令牌的主要内容,如果未能解决你的问题,请参考以下文章
基本 .ajax 发布到 rails 3.2.2 脚手架,生成“警告:无法验证 CSRF 令牌真实性”