略過至內容 略過至搜尋

Action Dispatch Session CookieStore

這個基於 cookie 的會話儲存是 Rails 的預設值,它比其他選項快上許多。

會話通常最多包含使用者 ID 和快閃訊息;這兩者都符合 4096 位元組的 cookie 大小限制。如果您嘗試儲存超過 4096 位元組的資料,將會引發 CookieOverflow 例外。

用於儲存的 cookie jar 會自動設定成符合您應用程式組態的最佳選項。

您的 cookies 會使用應用程式的 secret_key_base 進行加密。這比簽署的 cookies 更進一步,因為使用者的加密 cookies 無法被變更或讀取。這是從 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 會讓所有現有的會話失效。此外,您應注意在變更 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