1

我正在开发现有的 Rails 2 应用程序。我已经将一些散列数据结构转换为对象,如果我将一个放入会话存储中,它似乎会破坏会话,清除 user_id 等,并强制再次登录。我正在使用 dalli_store 进行会话。

以下代码导致会话被清除:

bug = MyClass.get_an_object()
session[:debug] = bug

目前尚不清楚它在哪里被消灭了。我可以在调试器中逐步完成渲染视图,并且会话很好,但是当我在 UI 中点击另一个链接时,session它是空的(哈希 [0]),我被重定向到登录页面。

如果我稍微改变一下代码,就可以了:

bug = MyClass.get_an_object()
session[:debug] = Marshal::dump(bug)

但是,如果我存储实际对象(甚至是深层副本),会话就会丢失。即即使这样也行不通:

session[:debug] = Marshal::load( Marshal::dump(bug) )

编组时 bug.size 大约为 140K,因此它不应超过 memcached。无论如何,我会假设 session 是由 序列化的Marshal::dump(),所以大小应该是相同的。存储后是否访问会话中的对象并不重要。只需将其放入会话中就足以导致问题,但正如我所说,存储对象后会话很好,并且一直通过视图渲染。直到下一个请求开始,我才发现它已被破坏。

我难住了。

你对如何调试这个有什么建议吗?目前,我想我可以显式调用 Marshal 来保存对象,但我真的很想了解为什么会话会被破坏。

我知道将大对象放入会话中是一件坏事,但是解决这部分问题超出了当前项目的范围......也许以后。另外,我很好奇这里发生了什么。

4

0 回答 0