2010-09-13 107 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”错误