如何检查 rails 中会话的大小?
How to check size of session in rails?
我希望 session.size
、session.length
或 session.count
可以工作,但它们都 return "undefined method"。为什么 session
不是散列?
那是好奇心。实际问题:有没有办法以 KB 为单位检查会话的大小?目前我的会话存储在 cookie 中,它有 4 KB 的限制,当它超过时,它就会停止将新数据放在那里。很高兴知道什么时候发生,重置会话或删除旧数据。
以下是 rails 获取会话大小的方法:
首先获取session数据,见(gems/rack/lib/rack/session/abstract/id.rb:352 commit_session)
data = session.to_hash.delete_if { |k,v| v.nil? }
然后会加密数据,见(gems/actionpack/lib/action_dispatch/middleware/cookies.rb:640):
data = @encryptor.encrypt_and_sign(serialize(name, data))
最后,获取字节:
data.bytesize
可以直接获取session data
但是手动加密比较麻烦。我一般在gem代码处加个log查看数据:
options[:value] = @encryptor.encrypt_and_sign(serialize(name, options[:value]))
puts options[:value].bytesize
raise CookieOverflow if options[:value].bytesize > MAX_COOKIE_SIZE
我希望 session.size
、session.length
或 session.count
可以工作,但它们都 return "undefined method"。为什么 session
不是散列?
那是好奇心。实际问题:有没有办法以 KB 为单位检查会话的大小?目前我的会话存储在 cookie 中,它有 4 KB 的限制,当它超过时,它就会停止将新数据放在那里。很高兴知道什么时候发生,重置会话或删除旧数据。
以下是 rails 获取会话大小的方法:
首先获取session数据,见(gems/rack/lib/rack/session/abstract/id.rb:352 commit_session)
data = session.to_hash.delete_if { |k,v| v.nil? }
然后会加密数据,见(gems/actionpack/lib/action_dispatch/middleware/cookies.rb:640):
data = @encryptor.encrypt_and_sign(serialize(name, data))
最后,获取字节:
data.bytesize
可以直接获取session data
但是手动加密比较麻烦。我一般在gem代码处加个log查看数据:
options[:value] = @encryptor.encrypt_and_sign(serialize(name, options[:value]))
puts options[:value].bytesize
raise CookieOverflow if options[:value].bytesize > MAX_COOKIE_SIZE