session[:food]="pizza"
和 和有什么区别cookies.permanent[:food]=pizza
?
我试图阅读 Rails 文档,它说:
Rails 2 引入了一个新的默认会话存储,CookieStore。CookieStore 将会话哈希直接保存在客户端的 cookie 中。
然后我不明白,如果 session[:food] 保存在 cookie 中,那么 cookies.permanent[:food] 有什么区别?
session[:food]="pizza"
和 和有什么区别cookies.permanent[:food]=pizza
?
我试图阅读 Rails 文档,它说:
Rails 2 引入了一个新的默认会话存储,CookieStore。CookieStore 将会话哈希直接保存在客户端的 cookie 中。
然后我不明白,如果 session[:food] 保存在 cookie 中,那么 cookies.permanent[:food] 有什么区别?
如果你做 session[:food] 你正在使用一个传统的 Rails 会话:这个会话对象通过将它存储在浏览器关闭时过期的cookie中来使你的值“披萨”在页面之间可用(这意味着如果你关闭浏览器,你的 session[:food] 将被销毁)
当我们谈论永久会话时,我们谈论的是永久会话,那是什么意思?
持久会话是即使您关闭浏览器仍然存在(“永远”)的永久 cookie,并且只有在您明确将其过期或将其删除时才会过期。
但是如何制作仍然“永远”存在的cookie?
如果我说“永远”,那是因为这是一个棘手的问题,这样做的方法是设置一个 cookie 过期很长一段时间,比如从现在起 20 年或 60 年......就像这样:
cookies[:remember token] = { value: "pizza", expires: 20.years.from now.utc }
这种设置 20 年后过期的 cookie 的模式变得如此普遍,以至于 Rails 添加了一个特殊的永久方法来实现它,因此我们可以简单地编写:
cookies.permanent[:food] = "pizza"
回答你的问题,结构上没有区别,每个都是一个cookie,但区别只是每个的生命周期
希望这对你有帮助
我建议您尝试一下,会话数据是在 cookie (rails 3) 或加密的 cookie (rails 4) 中进行 base64 编码的。使用像 Firefox 'Web Developer Extension' (WDE) 插件这样的工具,它有一个 cookie 菜单项,使用它来删除本地主机站点的所有 cookie,然后将代码添加到控制器操作
session[:food] = "pizza"
cookies.permanent[:food] = "pizza"
现在使用 WDE 查看 cookie
Name food
Value pizza
Host localhost
Path /
...
与会话
Name _session_name # (this value set in config/initializers/session_store.rb)
Value a_base_64_value
Host localhost
Path /
...
现在打开 Rails 控制台并解码会话值
$ rails console
> Base64.decode64('value from session')
# works in rails 3
如果使用 rails 4 cookie 被加密而不是仅仅被编码,参见http://cowbell-labs.com/2013-04-10-decrypt-rails-4-session.html
一旦解密或解码,它看起来像
{
"session_id"=>"xxxxx",
"user_return_to"=>"/",
"flash"=>{
"discard"=>[:alert],
"flashes"=>{
:alert=>"You need to sign in or sign up before continuing."}
},
"food"=>"pizza",
"_csrf_token"=>"xxxxx"
}
请注意,在我的情况下,我使用的是 Devise,它向闪存添加了一条消息
会话数据得到更好的保护,您还可以选择移动到不同的会话存储(如数据库),而无需更改任何代码,只需进行一些配置