Action Dispatch Session
CookieStore
此基于 Cookie 的会话存储是 Rails 的默认设置。它比其他备选方案快很多。
会话通常最多包含一个用户 ID 和闪存消息;两者都符合 4096 字节的 Cookie 大小限制。如果您尝试存储超过 4096 字节的数据,将引发 CookieOverflow
异常。
用于存储的 Cookie 容器会自动配置为在给定应用程序配置的情况下成为最佳选项。
您的 Cookie 将使用应用程序的 secret_key_base
进行加密。这比签名 Cookie 更进一步,因为用户无法更改或读取加密 Cookie。这是 Rails 4 中的默认设置。
在初始化程序中配置会话存储
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 的能力,这些 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 = {}) 链接
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 63 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) 链接
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 69 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) 链接
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_dispatch/middleware/session/cookie_store.rb, line 76 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