(这是关于 Ramaze.net 框架的)
在会话中存储自定义对象时遇到了一些非常奇怪的问题。我注意到只有立即存储在会话中的对象的属性被更新。但是,如果这些对象包含对其他对象的引用,则如果会话中包含的直接对象在请求期间没有更改,则不会更新这些引用的对象。
这个问题只有在使用 Ramaze::FileCache 作为我的会话缓存后端时才变得明显。我相信在使用内存会话时问题被掩盖或不是问题。
我发现问题是因为在 Ramaze::Session::Hash#method_missing (lib/ramaze/current/session/hash.rb) 中找到的会话逻辑中的“浅拷贝”。
作为一个快速测试以确保我的想法是正确的,我注释掉了“差异检查”,基本上每次都强制更新会话。
def method_missing(*args, &block)
old = @hash.dup
result = @hash.send(*args, &block)
#unless old == @hash
Cache.sessions[@session.session_id] = self
#end
result
end
这个小技巧解决了我的问题。现在我的问题是:
- 这是一个安全合理的解决方案吗?
- 我应该避免在会话中存储复杂/深层对象吗?
- 有什么我想念的吗?