【发布时间】:2018-12-10 15:23:57
【问题描述】:
我们有一个使用CookieStore 来存储会话数据的应用程序。除其他外,我们使用此功能在会话中存储对象以提高我们网站的性能,例如
session[:data] = some_object
通常没问题,但有时some_object 的表示太大而无法存储为cookie。在这种情况下,我们完全乐于不将对象存储在会话中 - 它只会稍微提高站点的性能,并且只会影响我们的少数用户。但是,要使其正常工作,我们需要尽早决定是否存储该对象,否则我们将在中间件级别获得 ActionDispatch::Cookies::CookieOverflow - 为时已晚。
有没有一种简单的方法来获取对象的大小?我们正在考虑将对象转换为 JSON 并检查它的字符串长度,但可能会有更好的解决方案。
简而言之,我们对实现以下stored_as_cookie_size 方法感兴趣:
if stored_as_cookie_size(some_object) < LIMIT
session[:data] = some_object
else
session[:data] = nil
end
【问题讨论】:
-
这个对象是私有的并且需要加密吗? (会话 cookie 总是加密的)加密会增加字符串的大小。此外,会话 cookie 已经存储了一些数据(CSRF 令牌..)也许您可以将此对象存储在单独的 cookie 中,无论是否加密,并在会话结束时将其删除
-
我们认为对我们来说最好的选择是重构它,使其存储在服务器端缓存中,但是这个功能已经在很多地方使用,我们还没有容量做这个重构。如果我们缩小限制,我们没关系,因为对于我们的大多数用户来说,对象的大小是
-
可能您可以只将对象 ID 存储在会话存储中,而不是整个对象。然后可以从该 id 中获取该对象。将整个对象存储在 cookie 中可能会暴露一些敏感数据。还有一件事 cookie 最大限制是 4kb,因此您不能存储大于该值的对象
-
@SujayGavhane 这用于缓存原因意味着仅存储 id 会破坏目的
标签: ruby-on-rails ruby session cookies