session[:food]="pizza"
和cookies.permanent[:food]=pizza
之间的区别是什么?
我试着阅读rails文档,它说:
Rails 2引入了一个新的默认会话存储CookieStore。 CookieStore将会话哈希直接保存在客户端的cookie中。
然后我不明白,如果会话[:food]保存在cookie中,所以cookies.permanent [:food]会这样做,有什么区别?
答案 0 :(得分:27)
如果您进行会话[:food],您正在使用传统的Rails会话:此会话对象会使您的价值与#34; pizza"通过将其存储在 cookie 中,在浏览器关闭时过期(这意味着如果您关闭浏览器,您的会话[:food]将被销毁),可以在页面之间进行操作/ p>
当我们谈论永久性时,我们谈论持久性会话,那么意味着什么?
持久会话是一个永久性的Cookie,即使您关闭浏览器也仍然存在("永远"),并且只有在您明确过期或删除它时才会过期。
但如何制作一个仍然存在的cookie"永远" ?
如果我说"永远"这是因为这是一个棘手的问题,这样做的方法是设置一个cookie过期很长一段时间,比如20年或者60年......就像这样:
cookies[:remember token] = { value: "pizza", expires: 20.years.from now.utc }
这种设置未来20年到期的cookie的模式就这样了 通常Rails添加了一个特殊的永久方法来实现它,所以我们可以 简单地写一下:
cookies.permanent[:food] = "pizza"
回答你的问题,结构上没有差异,每一个都是一个cookie,但差异只在每个人的生命周期中
希望这能帮到你
答案 1 :(得分:9)
我建议您尝试一下,会话数据在cookie(rails 3)或加密cookie(rails 4)中进行base64编码。使用像Firefox的“Web Developer Extension”(WDE)插件这样的工具,它有一个cookie菜单项,用它来删除你的localhost站点的所有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 console并解码会话值
$ 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,它已向闪存添加了消息
会话数据受到更好的保护,您还可以选择在不更改任何代码的情况下移动到不同的会话存储(如数据库),只需一些配置