Rails 4:如何在redirect中设置cookies?

Rails 4: How to set cookies in redirect?

我有一个控制器尝试获取表单输入,在 cookie 中设置值,然后重定向到将从该 cookie 中提取的页面。

问题是 cookie 从未在重定向 headers 中设置。

注:我在Chrome和FF中测试过。 Rails版本是4.0.13。设置 cookies w/o 重定向按预期工作。

控制器代码如下:

def create
  request.cookies[:foo] = "bar"

  # also tried:
  #   cookies[:foo]="bar"
  #   cookies.signed[:foo]="bar"
  #   cookies[:foo] = {
  #     value: "bar",
  #     expires: 1.month.from_now,
  #     domain: ".myapplicationhostname.com"
  #   }

  redirect_to root_url
end

重定向的响应 header 不包含 Set-Cookie 属性,因此,cookie 值在 controller/action 和 redirected-to 路径。

我发现一些 contradictory evidence 某些浏览器不接受重定向中的 cookie,但现在似乎不再是这种情况了?无论如何,FF 或 Chrome 都没有在响应 header 中显示 Set-Cookie,因此这似乎不是浏览器问题。

这是来自 cURL 的 header 响应,请注意缺少 Set-Cookie:

HTTP/1.1 302 Moved Temporarily
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Location: http://app.mydomain.com:3000/
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
X-Request-Id: 1fc1c7e5-7489-4720-bb70-28588f3abcb6
X-Runtime: 4.688166
Connection: close
Server: thin 1.6.2 codename Doc Brown

如何让 rails 在重定向上设置 cookie(或至少设置 header)?

看来,这实际上是 CSRF 保护启动的原因。控制器实例化了一个 NullCookieJar,当存在潜在伪造的 POST.[=14= 时,它会阻止写入 cookie。 ]

这是因为我的控制器被设置为响应异地表单,因此无法访问 CSRF 令牌。

因此,如果您在向 Rails 应用提交站外表单时 运行 遇到这种情况,则需要禁用 CSRF 检查或编写自己的验证方法作为在 SO 问题的答案中描述:"Receive POST from External Form".

此处总结:

禁用检查

skip_before_filter :verify_authenticity_token, only: :my_action

自定义检查

skip_before_filter :verify_authenticity_token, :only => :my_action
before_filter :verify_custom_authenticity_token, :only => :my_action

def verify_custom_authenticity_token
  # checks whether the request comes from a trusted source
end