ruby-on-rails session[:food]和cookies的区别,permanent[:food]

qco9c6ql  于 2023-05-08  发布在  Ruby
关注(0)|答案(3)|浏览(120)

session[:food]="pizza"cookies.permanent[:food]=pizza有什么区别?
我试着阅读Rails文档,它说:
Rails 2引入了一个新的默认会话存储库CookieStore。CookieStore将会话哈希直接保存在客户端的cookie中。
那我就不明白了,如果session[:food]保存在cookie中,那么cookies.permanent[:food]也保存了,有什么区别呢?

ktecyv1j

ktecyv1j1#

如果你使用session[:food],你使用的是传统的Rails session:此session对象通过将值“pizza”存储在cookie中,使其在浏览器关闭时过期(这意味着如果您关闭浏览器,会话[:food]将被销毁),从而使您的值在页面之间可用。
当我们谈论永久时,我们谈论的是持久会话,那么这意味着什么呢?
持久会话是一个永久性的cookie,即使您关闭浏览器,它仍然存在(“永远”),只有在您明确地使其过期或删除它时才会过期。
但如何让饼干“永远”存在呢?
如果我说“永远”,这是因为这是一个棘手的,这样做的方式是设置一个cookie过期很长一段时间,如20年从现在开始或60年…就像这样:

cookies[:remember token] = { value: "pizza", expires: 20.years.from now.utc }

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

cookies.permanent[:food] = "pizza"

回答你的问题,在结构上没有区别,每一个都是一块饼干,但区别只是在每一个的寿命上
希望这对你有帮助

5sxhfpxr

5sxhfpxr2#

我建议你尝试一下,会话数据是base64编码的cookie(rails 3)或加密cookie(rails 4)。使用Firefox 'Web Developer Extension'(WDE)插件之类的工具,它有一个cookie菜单项,使用它来删除本地主机站点的所有cookie,然后将代码添加到控制器操作中

session[:food] = "pizza"
cookies.permanent[:food] = "pizza"

现在使用WDE查看cookie

Name    food
Value   pizza
Host    localhost
Path    /
...

vs会话

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,它在Flash中添加了一条消息
会话数据得到了更好的保护,您还可以选择移动到不同的会话存储(如数据库),而无需更改任何代码,只需进行一些配置

vawmfj5a

vawmfj5a3#

session[:food]cookies.permanent[:food]之间的主要区别是前者将数据存储在服务器上并将其与用户的会话相关联,而后者将数据存储在客户端的浏览器上并在多个会话中持久化。
在Rails中,session[:food]使用指定的值设置名为:food的会话变量。会话数据存储在服务器端,并且可以由服务器访问和修改。当用户关闭浏览器或会话超时时,会话数据将被清除。
另一方面,cookies.permanent[:food]使用指定的值设置一个名为:food的cookie。cookie数据存储在客户端,可以通过运行在客户端的JavaScript访问和修改。Cookie数据在多个会话中持续存在,即使在用户关闭浏览器或关闭计算机后,它也仍然可用。

相关问题