会话[:food]和cookies.permanent [:food]之间的区别

zer*_*uno 6 cookies session ruby-on-rails

session[:food]="pizza"cookies.permanent[:food]=pizza?之间有什么区别?
我试着阅读rails文档,它说:

Rails 2引入了一个新的默认会话存储CookieStore.CookieStore将会话哈希直接保存在客户端的cookie中.

然后我不明白,如果会话[:food]保存在cookie中,所以cookies.permanent [:food]会这样做,有什么区别?

med*_*zid 27

如果你做会话[:food]你正在使用传统的Rails会话:这个会话对象通过将它存储在一个cookie中,使得你的值"披萨" 在浏览器关闭时到期(这意味着如果你关闭浏览器,你的会话[:食物]将被销毁)

当我们谈论永久性时,我们谈论持久性会话,那么意味着什么?

持久会话是一个永久性cookie,即使您关闭浏览器仍然存在("永远"),并且只有在您明确过期或删除它时才会过期.

但如何制作一个仍然存在"永远"的饼干?

如果我说"永远"它是因为这是一个棘手的方法,这样做的方法是设置一个cookie过期很长一段时间,从现在开始20年或60年......就像这样:

cookies[:remember token] = { value: "pizza", expires: 20.years.from now.utc }
Run Code Online (Sandbox Code Playgroud)

这种设置将在未来20年到期的cookie的模式变得如此普遍,以至于Rails添加了一种特殊的永久方法来实现它,因此我们可以简单地写:

cookies.permanent[:food] = "pizza"
Run Code Online (Sandbox Code Playgroud)

回答你的问题,结构没有区别,每一个都是一个cookie,但差异只在每个人的生命周期中

希望这能帮助你


hou*_*se9 9

我建议您尝试一下,会话数据在cookie(rails 3)或加密cookie(rails 4)中进行base64编码.使用像Firefox的"Web Developer Extension"(WDE)插件这样的工具,它有一个cookie菜单项,用它来删除localhost网站的所有cookie,然后将你的代码添加到控制器动作中

session[:food] = "pizza"
cookies.permanent[:food] = "pizza"
Run Code Online (Sandbox Code Playgroud)

现在使用WDE查看cookie

Name    food
Value   pizza
Host    localhost
Path    /
...
Run Code Online (Sandbox Code Playgroud)

vs会话

Name    _session_name # (this value set in config/initializers/session_store.rb)
Value   a_base_64_value
Host    localhost
Path    /    
...
Run Code Online (Sandbox Code Playgroud)

现在打开rails控制台并解码会话值

$ rails console
> Base64.decode64('value from session')
# works in rails 3
Run Code Online (Sandbox Code Playgroud)

如果使用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"
}
Run Code Online (Sandbox Code Playgroud)

请注意,在我的情况下,我使用的是Devise,它向flash添加了一条消息

会话数据受到更好的保护,您还可以选择移动到不同的会话存储,如数据库,而无需更改任何代码,只需一些配置