2010-09-13 145 views
1

在Rails 3中,默認的會話存儲機制是cookie_store。我認爲這意味着會話哈希中的內容被序列化,編碼並存儲在瀏覽器中的cookie中?這是否意味着會話中沒有(或很少)會存儲在服務器中?Rails 3基於Cookie的會話問題

我有幾個問題,我有一個cookie溢出錯誤,我假設,因爲我不斷添加到我的用戶實例(這也鏈接/從cookie中提取)。

u = session[:user] 
u.add_this lots_of_data 

所以最終我得到了一個cookie溢出錯誤。

我正確嗎?會話是否完全存儲在Rails 3中的Cookie中(默認情況下)?

回答

5

是的,如果您使用cookie存儲,會話數據將存儲在cookie中。如果您想將其存儲在服務器上,則需要使用其他會話存儲。

但是,如果您在會話中存儲模型對象或「大量數據」,那麼您很可能首先做錯了。你的數據應該到數據庫,並且會話應該只包含儘可能多的信息,因爲你需要檢索它。

在你的情況下,這將意味着將用戶ID存儲在會話中,並從db中將用戶加載到before_filter中。

+0

是的,確切地說。換句話說,當你只能存儲他們的數據庫ID時,不要在會話中存儲整個模型。 – 2010-09-13 07:56:57

+0

對。究竟!問題依然存在,模型本身是否會在Cookie中隨着您在服務器上的填充而變得越來越大? – matsko 2010-09-13 16:02:43

+0

如果您將ID放入會話中,您將在會話中擁有該ID,沒有別的。如果在會話中放置一個完整的對象(如上面的示例中所示),它將佔用序列化對象所需的儘可能多的空間... – averell 2010-09-14 07:36:39

0

是的,你是對的。如果您繼續向會話添加數據,問題可能會出現。 但還有其他一些事情會影響它。

有一次,我結束了CookieOverflow錯誤,原因是閃光[:notice]消息。

如果您使用flash [:notice] =「message」,然後重定向,文本「消息」將存儲在cookie中。如果您傳遞的文本大小超過4KB,則會得到「CookieOverflow」錯誤