ruby-on-rails - rails 4 : How to set cookies in redirect?

标签 ruby-on-rails redirect ruby-on-rails-4 cookies

我有一个 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/

相关文章:

ruby-on-rails - 为 Omniauth 构建新策略,但 Omniauth 找不到

javascript - HTTP 200 + 空响应 + 重定向

.htaccess - htaccess 将所有页面重写到另一个域上的同一页面

html - 使用 htaccess 和 301 permanent moved 将旧的 url 流量重定向到新的 url

ruby-on-rails-4 - Ruby on Rails 4 不显示 content_tag :i

javascript - AJAX日历更新页面rails 4

ruby-on-rails - 在 Rails 的时间范围内跟踪页面流行度

ruby-on-rails - 每组 Rails LIMIT

ruby-on-rails - 尝试加载 gem 'uglifier' 时出错。 ( bundler ::GemRequireError)

ruby-on-rails - Rails 片段缓存 : would 100K+ fragments degrade performance?