2011-10-12 31 views
13

我正在通過閱讀在線指南來學習Rails(適用於Rails v2.3)。該指南非常好,但是,對我來說有一個困惑,那就是:Rails v2.3:會話和Cookie之間的區別

有一章解釋了Rails的Session,另一章解釋了Rails的Cookies。這個解釋很容易分開來理解,但是當比較兩者時,像我這樣的讀者沒有看到Session和Cookies之間的顯着差異。特別是在哪種情況下應該使用會話,在哪種情況下應該使用Cookie?

此外,在會話章節中,有一個CookieStore的概念,CookieStore和Cookies之間有什麼區別呢?

有人可以向我解釋這些嗎?

回答

22

會話& Cookie既能存儲一些信息(例如:current_user id)在兩個或多個請求之間(在http中)是無狀態的。

但Session更多的是一個抽象的概念,它與處於特定狀態的特定時間的概念有關:它所包含的信息可以存儲在數據庫,服務器端文件,redis hash 或在一個曲奇

Cookie總是小文本文件導航器必須在請求之間存儲一些持久性數據......但在客戶端有一些數據可能不安全,所以這就是爲什麼它經常被加密。但是這個概念確實可以與會話重疊。

TL; DR:會話保持臨時數據的抽象概念。餅乾一種(共同的)方式做它。

6

對我而言,主要的區別是會話數據存儲在服務器上,而Cookie存儲在客戶端(瀏覽器)上。

所以你可以信任會話中的數據。來自Cookie的信息可以被操縱,被竊取,因此不應該依賴於關鍵用途(例如,用於正確訪問)。

第二點是,Cookie的大小是有限的,並且只是基於文本的。您可以在會話中存儲許多複雜的對象(但要小心記憶消耗),並且您不必在每次請求時將它們傳輸到客戶端。

+1

這些基於cookie的會話存在於客戶端,並對其數據進行編碼。 – secretlm

7

Cookie是存儲在瀏覽器中的一個小文本文件。

會話是「正在使用」狀態的概念,並且該狀態可以具有與其關聯的數據。 Rails使用Cookie跟蹤會話,並允許您爲關聯數據選擇不同的存儲,並使用相同的session界面訪問它。

CookieStore表示所有會話信息都存儲在cookie本身內部。您可以選擇適當地使用各種其他商店,並且它仍然可以使用您的session訪問器方法。

除了會話之外,您還可以設置其他Cookie以在用戶的​​瀏覽器上存儲信息。這些與會話無關,可以獨立設置,訪問和刪除。

例1中,存儲有已登錄用戶的購物車中的會話:

session[:embarassing_products] = ['ooh', 
            'naughty', 
            'lucky_im_using_activerecord_store', 
            'only_the_session_id_is_in_the_cookie', 
            'other_data_arent_in_the_browser'] 

的購物車被保存在用戶的會話。您可以將會話設置爲在瀏覽器窗口關閉時,用戶退出時或經過一定時間時結束。

例2,記住在一個cookie域瀏覽器的最後一個語言首選項:

cookie[:lang] = 'en-US' 

此信息存儲在cookie自身內部。除非Cookie過期或被刪除(由您或用戶),否則它保留在瀏覽器內。

3

而且通常會話只會持續到用戶關閉瀏覽器。這對典型的登錄很有用。而如果您需要在會話之間持續存在的信息,則可以使用持續時間更長的cookie,例如即使在重新啓動瀏覽器後仍然存在的「記住我」標記。

相關問題