我有一个 Controller ,它尝试接受表单输入,在 cookie 中设置值,然后重定向到将从该 cookie 中提取的页面。
问题是 cookie 从未在重定向 header 中设置。
注意:我已经在 Chrome 和 FF 中进行了测试。 Rails 版本是 4.0.13。设置没有重定向的 cookie 按预期工作。
这是 Controller 代码:
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
重定向的响应头不包含 Set-Cookie 属性,因此,cookie 值在重定向到路径的 Controller /操作中不可用。
我找到了一些 contradictory evidence某些浏览器不接受重定向中的 cookie,但似乎不再如此?无论如何,FF 或 Chrome 都没有显示
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(或至少设置标题)?
最佳答案
看来,造成这种情况的原因实际上是 CSRF 保护。 Controller 已经实例化了一个 NullCookieJar
。这可以防止在存在潜在伪造的 POST 时写入 cookie。
这是因为我的 Controller 被设置为响应异地表单,因此无法访问 CSRF token 。
因此,如果您在向 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
关于ruby-on-rails - rails 4 : How to set cookies in redirect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29577434/