Rails 4:如何在重定向中设置cookie?

Bry*_*ble 3 cookies redirect ruby-on-rails ruby-on-rails-4

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

问题是cookie永远不会在重定向标头中设置.

注意:我已在Chrome和FF中测试过.Rails版本是4.0.13.设置没有重定向的cookie可以按预期工作.

这是控制器代码:

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
Run Code Online (Sandbox Code Playgroud)

重定向上的响应头不包含Set-Cookie属性,因此,cookie值在重定向到路径中的控制器/操作中不可用.

我发现一些相互矛盾的证据表明某些浏览器在重定向中不接受cookie,但似乎不再是这种情况了?无论如何,FF或Chrome都没有Set-Cookie在响应标题中显示,因此它不会出现这是一个浏览器问题.

这是来自cURL的标题响应,请注意缺少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
Run Code Online (Sandbox Code Playgroud)

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

Bry*_*ble 5

看起来其原因实际上是CSRF保护.控制器已经实例化了一个NullCookieJar,当有可能伪造的POST时,它会阻止写入cookie.

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

因此,如果您在向Rails应用程序提交异地表单时遇到此问题,则需要禁用CSRF检查或编写自己的验证方法,如SO问题的答案所述:"从外部表格".

总结一下:

禁用检查

skip_before_filter :verify_authenticity_token, only: :my_action
Run Code Online (Sandbox Code Playgroud)

自定义检查

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
Run Code Online (Sandbox Code Playgroud)