跳至内容 跳至搜索

Action Dispatch Session CookieStore

这个基于 cookie 的 session 存储是 Rails 的默认选择。它比其他方案快得多。

Session 通常最多包含一个用户 ID 和闪存消息;这两个内容都在 4096 字节的 cookie 大小限制内。如果您尝试存储超过 4096 字节的数据,将会引发 CookieOverflow 异常。

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

您的 cookie 将使用应用程序的 secret_key_base 进行加密。这比签名的 cookie 更进一步,因为加密的 cookie 无法被用户更改或读取。这是从 Rails 4 开始的默认设置。

在初始化器中配置您的 session 存储

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

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

如果您的应用程序没有更新到 Rails 5.2 的默认设置,则可以在旧的 config/secrets.yml 文件中找到 secret_key_base

请注意,更改 secret_key_base 会使所有现有的 session 无效。此外,您应该注意确保在更改 secret_key_base 之前,您不会依赖于在外部应用程序或 JavaScript 中解码应用程序生成的签名 cookie 的能力。

由于 CookieStore 扩展了 Rack::Session::Abstract::Persisted,因此可以使用那里描述的许多选项来定制生成的 session cookie。例如

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

将会在创建 14 天后自动设置 session cookie 过期。其他有用的选项包括 :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