【发布时间】:2012-02-29 23:00:15
【问题描述】:
我有一个使用 Rack::Session::Cookie 的 Sinatra 应用程序
use Rack::Session::Cookie, :key => 'my.key',
:path => '/',
:expire_after => 3600, # In seconds
:secret => 'something'
我在会话中有一个地方设置数据,我在 erb 调用之前对会话进行转储,大约 600 字节
puts "session is #{session.inspect}" ==> 400 bytes of text
然后我得到
Warning! Rack::Session::Cookie data size exceeds 4K.
Warning! Rack::Session::Cookie failed to save session. Content dropped.
有趣的是,这一切似乎都在起作用,因为我在会话中设置的所有内容都会在下一次点击时返回给我。 Safari 开发窗口中报告的会话大小为 1195 字节,看起来都是加密的,等等。
关于如何发生这种情况的任何想法?该消息似乎是虚假的,但查看 Rack:Session 代码 - 似乎正在转储某些东西......
【问题讨论】:
-
如果您对会话所需的数据量感兴趣,则 session.inspect 不是您想要检查的内容。像
Marshal.dump(session.to_hash)这样的东西更接近标记 -
如果我将会话作为字符串获取,然后调用 Marshall.dump,然后进行加密,我得到 1300 个字节,这与我看到的 cookie 匹配。所以仍然没有运气弄清楚。
-
pst 是绝对正确的。在您的 Rack gem 代码中找到消息“数据大小超过”并在那里添加检查语句。
-
如果我错误地抢救了一个异常,而不是将其消息存储到会话中(通过使用 flash()),而是保存了整个对象,那么我在 rails 中就发生了这种情况。例如。 flash(exception.to_s) 版本 flash(exception)。检查您是否没有在会话中保存意外值。
-
是否因为您的域的 cookie 集总共超过 4K 而引发错误?
标签: ruby session cookies sinatra rack