Я знаю, что как только сеанс доступен, идентификатор сеанса назначается рельсами. Я слышал, что если сеанс изменяется, у rails есть метка версии в сеансе.
Это утверждение легко проверить на ложность, прочитав исходный код ActionDispatch::Session::CookieStore
* 1007. *.
# frozen_string_literal: true
require "active_support/core_ext/hash/keys"
require "action_dispatch/middleware/session/abstract_store"
require "rack/session/cookie"
module ActionDispatch
module Session
# ... comments truncated for readibility
class CookieStore < AbstractStore
def initialize(app, options = {})
super(app, options.merge!(cookie_only: true))
end
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 } : {})
new_sid
end
def load_session(req)
stale_session_check! do
data = unpacked_cookie_data(req)
data = persistent_session_id!(data)
[data["session_id"], data]
end
end
private
def extract_session_id(req)
stale_session_check! do
unpacked_cookie_data(req)["session_id"]
end
end
def unpacked_cookie_data(req)
req.fetch_header("action_dispatch.request.unsigned_session_cookie") do |k|
v = stale_session_check! do
if data = get_cookie(req)
data.stringify_keys!
end
data || {}
end
req.set_header k, v
end
end
def persistent_session_id!(data, sid = nil)
data ||= {}
data["session_id"] ||= sid || generate_sid
data
end
def write_session(req, sid, session_data, options)
session_data["session_id"] = sid
session_data
end
def set_cookie(request, session_id, cookie)
cookie_jar(request)[@key] = cookie
end
def get_cookie(req)
cookie_jar(req)[@key]
end
def cookie_jar(request)
request.cookie_jar.signed_or_encrypted
end
end
end
end
Как видите, persistent_session_id!
перезаписывает существующий идентификатор сеанса cook ie. Он не отслеживает предыдущие sid. Для других хранилищ, таких как сессий, memcached (dalli) и ActiveRecord, очевидно, что они явно не удаляют sid, но нет никакого вида «версий» api, как вы себе представляли.
Если вы хотели чтобы получить эту функциональность, вы должны поменять ActionDispatch :: Session :: CookieStore (или любой другой магазин, который вы используете) в стеке промежуточного программного обеспечения на свое собственное промежуточное программное обеспечение сеансов.
Вероятно, есть более простое решение для всего, что вы делаете, хотя, если его обычные вещи, такие как хранение количества пользовательских логинов (сохраните его в БД) или просмотров страниц (используйте Google Analytics или БД) или что там у вас. Кроме того, если все, что вы делаете, требует версионности - должно ли это быть на самом деле во время сеанса?