【问题标题】:Is it possible for Rails sessions to be created 'just in time'?Rails 会话是否可以“及时”创建?
【发布时间】:2011-05-07 05:09:42
【问题描述】:

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

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

但是,当涉及到使用 HTTP 缓存服务和代理(例如 Varnish)在站点中缓存页面时,这会带来一些问题,因为大多数配置往往会在请求和响应结束(因为缓存通常是针对一般受众的)。

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

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

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

那个,或者我想错了这个问题,需要换个角度来解决这个问题……

【问题讨论】:

  • 如果您只是保持原样并执行 ajax 调用以加载页面的“用户特定”部分,它是否有效?

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


【解决方案1】:

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

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

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

【讨论】:

  • 现在没有了,至少在 Rails 3.2.1 中没有。这些类仍然存在,但为空。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多