控制器中的 request.cookies 和 cookie 有啥区别?
Posted
技术标签:
【中文标题】控制器中的 request.cookies 和 cookie 有啥区别?【英文标题】:What is the difference between request.cookies and cookies in a controller?控制器中的 request.cookies 和 cookie 有什么区别? 【发布时间】:2016-10-06 01:22:24 【问题描述】:Ruby on Rails 中的request.cookies
和cookies
对象有区别吗?
我目前正在尝试从我的 node.js 服务器向我的 ROR4 应用程序发送一个带有 cookie 的请求。似乎在 ROR 应用程序中,request.cookies
包含我要发送的 cookie,但 cookies
对象(现有逻辑所基于)没有它。
我已经搜索了文档,但找不到任何相关内容。有什么我错过的吗?任何帮助表示赞赏。
【问题讨论】:
我遇到了同样的问题。您找出差异背后的原因了吗? 【参考方案1】:理想情况下,request.cookies
和 cookies
应该相同。但是,在 POST(创建操作)请求中,rails 会验证 XSRF 令牌。如果该验证失败,来自request.cookies
的cookie 在request.cookie_jar
中不可用。这意味着,它们不能通过 cookies
方法获得。
确定 cookie 不匹配是否是因为 XSRF 令牌丢失。在您的请求中,尝试识别您的 cookie 哈希的类别。 cookies.hash
应该返回给你ActionDispatch::Cookies::CookieJar
。如果它返回 ActionController::RequestForgeryProtection::ProtectionMethods::NullSession::NullCookieJar
,则说明 XSRF 令牌不匹配。
当您通过默认情况下不选择 XSRF 令牌并随请求发送的 javascript 进行这些调用时,可能会发生这种情况。在此处查看答案:https://***.com/a/8175979/976880 了解如何修复它。
【讨论】:
仅供参考:代替cookies.hash
,您也可以使用cookies.class
【参考方案2】:
request.cookies
是一个Rack provided 方法。它只是键值对的散列,通过解析 cookie 标头获得。
控制器cookies
方法返回request.cookie_jar
。 cookie jar 是由完全相同的 request.cookies
数据构建的,但在解析它时添加了一堆 Rails 功能,例如签名的 cookie、将数据序列化为 cookie 等。
我看不出为什么一个键会出现在一个中,而另一个中没有。
【讨论】:
以上是关于控制器中的 request.cookies 和 cookie 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章