【问题标题】:How to check size of session in rails?如何检查rails中的会话大小?
【发布时间】:2016-11-26 02:23:46
【问题描述】:

我希望 session.sizesession.lengthsession.count 能够工作,但它们都返回“未定义的方法”。为什么,session 不是哈希?

那是好奇心。实际问题:有没有办法检查会话的大小(以 KB 为单位)?目前我的会话存储在 cookie 中,它有 4 KB 的限制,当它超过时,它就会停止将新数据放在那里。很高兴知道何时发生、重置会话或删除旧数据。

【问题讨论】:

  • 为什么要在会话中存储 4KB?!我确信有更好的方法来实现这一点。
  • 假设不是我,我只是在调查会话过载的错误。无论如何,它主要发生在开发中,实际用户不太可能发生,但有一个备份解决方案会很好。
  • 我认为通过计算你只是在解决症状而不是实际问题:为什么会话中有 4KB?他们来自哪里?如何将这些数据存储在其他地方?
  • 它们来自于打开 很多 新的答案页面,并创建了一个新的受访者并将 id 存储在会话中(因此稍后可以从同一台机器继续回答) .还有加密字符串,但我认为我不应该修补它们。
  • 不知道,实现起来真的很简单。看到这个blog.teamtreehouse.com/…

标签: ruby-on-rails session session-cookies


【解决方案1】:

以下是 rails 获取会话大小的方式:

首先,获取会话数据,见(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

您可以直接获取会话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

【讨论】:

  • 我不再使用rails,所以我无法检查,但无论如何我都会接受这个,看起来不错。
  • 感谢您接受我的回答@Simoroshka。我刚刚遇到了CookieOverflow 问题,所以我找到了这种方法来检查我的实际会话大小使用情况,它大于 4096。
猜你喜欢
  • 1970-01-01
  • 2021-06-03
  • 2014-03-09
  • 2016-10-22
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
相关资源
最近更新 更多