6

我对 Ruby on Rails(特别是 v3 及更高版本)中会话生命周期的理解是,会话是在请求开始时为每个请求创建的,如果该请求不携带现有会话 cookie,则创建一个新会话将被创建,否则会话 cookie 将被反序列化并存储在会话哈希中。

当然,这样做的目的是支持许多安全功能,例如 CSRF 等。

但是,当涉及到使用 HTTP 缓存服务和代理(例如 Varnish)在站点中缓存页面时,这会带来一些问题,因为大多数配置倾向于在请求和响应中去除这些(通常是所有)cookie结束(因为缓存通常是为一般观众准备的)。

我知道可以设置 Varnish 等来创建包含 cookie 详细信息的对象哈希,这会将缓存的数据范围限定为该会话(以及该用户),但是我想知道这是否完全有必要。

我有一个本质上相当“静态”的应用程序 - 内容是从数据库中提取的,呈现到可以缓存的页面中 - 有一些元素(例如评论计数,“最近”项目等)可以是添加了一个 ESI,但是对于每个请求,Rails 仍然倾向于设置一个新会话,并且当用户已经有一个会话时,缓存服务器会删除这些内容。

我想知道是否有可能(通过预先存在的功能,或自己构建功能)允许开发人员控制何时需要会话,并且只有在指定时才使用 cookie、会话初始化/反序列化等必要。

那,或者我正在以错误的方式思考这个问题,需要从另一个角度解决这个问题......

4

2 回答 2

1

据我所知,rails 会话可以通过 ActionController::SessionManagement 进行相当深入的控制

http://ap.rubyonrails.org/classes/ActionController/SessionManagement/ClassMethods.html#M000070

API 文档中有关于按操作、按控制器等禁用它的示例。

于 2011-01-31T09:35:28.370 回答
1

如果您的网站大部分是静态的,那么您可能需要使用整页缓存。这将 Rails 完全排除在请求之外,让 Web 服务器在生成内容后处理它。就评论数量和用户细节而言,根据您的确切需求,可能会引起一些严重的头痛。

于 2011-02-11T02:46:45.500 回答