2013-11-09 54 views
5

這是session[:food]="pizza"cookies.permanent[:food]=pizza之間的區別?
我試圖讀取的軌道文檔和它說:
差[:食品] cookies.permanent和[:食品]

梁2引入了一個新的默認會話存儲,的CookieStore。 CookieStore將會話散列直接保存在客戶端的Cookie中。

然後我不明白,如果會議[:食品]被保存在一個cookie中,所以cookies.permanent [:食品]做的,有什麼區別?

+0

您可以更改會話存儲,可能與cookies不同 – apneadiving

回答

9

我建議你嘗試一下,會話數據是base64編碼在cookie(導軌3)或加密的cookie(導軌4)。使用像Firefox的Web開發擴展「(WDE)插件的工具,它有一個cookie的菜單項,用它來刪除所有cookie爲您的本地主機的網站,那麼你的代碼添加到一個控制器動作

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

現在查看使用WDE

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 / 
... 

現已開放軌控制檯和解碼會話值

0123餅乾
$ rails console 
> Base64.decode64('value from session') 
# works in rails 3 

如果使用導軌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" 
} 

注意,在我的情況下,我使用它增加了設計消息閃光燈

會話數據得到更好的保護,你也有轉移到如數據庫不同的會話存儲在不改變任何代碼的選項,只是一些配置

24

如果你這樣做會話[:食品]您使用的是傳統的Rails的會議:這次會議目的是通過將其存儲在餅乾是在瀏覽器過期接近(讓你的價值「比薩」,可從頁面到頁面這意味着如果關閉瀏覽器,會話[:食品]將被銷燬)

當我們談論永久性時,我們討論永久性會話,那麼意味着什麼?

持續會話是仍然存在(「永遠」),即使你關閉瀏覽器,並沒有過期只有當你明確到期或刪除它永久的cookie。

但如何使一個仍然存在的cookie「永遠」?

如果我說「永遠」,那是因爲這是一個棘手的和做到這一點的方法是設置一個cookie過期從現在或60年的漫長時間長像20年....像這樣:

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

設置,使用期限20年以後變得如此 普遍,所以Rails特別添加了永久的方法來實現它,這樣我們就可以 簡單地寫一個cookie的這種模式:

cookies.permanent[:food] = "pizza" 

回答你的問題,沒有在結構上沒有區別,每一個都是一個cookie,但差別只在每一個

希望的生命週期這個幫助你

+0

很好的解釋! – karlihnos