跳至内容 跳至搜索

Action Dispatch Session CookieStore

这是基于 cookie 的默认会话存储,比其他替代方案快得多。

会话通常最多包含用户 ID 和 flash 消息;这两者都符合 4096 字节的 cookie 大小限制。如果您尝试存储超过 4096 字节的数据,将引发 CookieOverflow 异常。

用于存储的 cookie 罐会自动配置为根据应用程序的配置成为最佳选项。

您的 cookie 将使用应用程序的 secret_key_base 进行加密。这比签名 cookie 更进一步,因为加密的 cookie 不会被用户篡改或读取。这是 Rails 4 及更高版本的默认设置。

在 initializer 中配置您的会话存储

Rails.application.config.session_store :cookie_store, key: '_your_app_session'

在开发和测试环境中,您的应用程序的 secret_key_base 由 Rails 生成,并存储在 tmp/local_secret.txt 的临时文件中。在所有其他环境中,它将加密存储在 config/credentials.yml.enc 文件中。

如果您的应用程序未更新为 Rails 5.2 的默认设置,secret_key_base 将在旧的 config/secrets.yml 文件中找到。

请注意,更改您的 secret_key_base 将使所有现有会话失效。此外,在更改它之前,您应该注意不要依赖于能够解码由您的应用程序生成的签名 cookie(在外部应用程序或 JavaScript 中)。

由于 CookieStore 扩展了 Rack::Session::Abstract::Persisted,因此其中描述的许多选项都可以用于自定义生成的会话 cookie。例如:

Rails.application.config.session_store :cookie_store, expire_after: 14.days

将设置会话 cookie,使其在创建后 14 天自动过期。其他有用的选项包括 :key:secure:httponly:same_site

命名空间
方法
D
L
N

类公共方法

new(app, options = {})

# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 64
def initialize(app, options = {})
  options[:cookie_only] = true
  options[:same_site] = DEFAULT_SAME_SITE if !options.key?(:same_site)
  super
end

实例公共方法

delete_session(req, session_id, options)

# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 70
def delete_session(req, session_id, options)
  new_sid = generate_sid unless options[:drop]
  # Reset hash and Assign the new session id
  req.set_header("action_dispatch.request.unsigned_session_cookie", new_sid ? { "session_id" => new_sid.public_id } : {})
  new_sid
end

load_session(req)

# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 77
def load_session(req)
  stale_session_check! do
    data = unpacked_cookie_data(req)
    data = persistent_session_id!(data)
    [Rack::Session::SessionId.new(data["session_id"]), data]
  end
end