Rack は、Cookie の代わりにカスタム セッション ID アイテムを使用できます。
require 'rack/session/abstract/id'
ラックのドキュメントは、検索を開始するのに役立つ場合があります。「スキップ」オプション(または「延期」オプション)を探していると思います。
ドキュメント:
ID は、ID ベースのセッション サービスを実装するための基本的なフレームワークをセットアップします。セッションを維持するためにクライアントに送信される Cookie には、ID 参照のみが含まれます。上書きする必要があるのは #get_session と #set_session だけです。
すべてのパラメーターはオプションです。
- :key は Cookie の名前を決定します。デフォルトでは「rack.session」です。
- :path、:domain、:expire_after、:secure、および :httponly は、Rack::Response#add_cookie によって関連する Cookie オプションを設定します
- :skip は、応答に Cookie を設定したり、セッション状態を更新したりしません
- :defer は応答に Cookie を設定しませんが、バックエンドで使用されている場合はセッション状態を更新します
- :renew (実装に依存) は、新しいセッション ID の生成と、新しい ID で参照されるデータの移行を促します。:defer が設定されている場合、オーバーライドされ、Cookie が設定されます。
- :sidbits は、生成されたセッション ID の長さのビット数を設定します。
これらのオプションは、env['rack.session.options'] の場所で、リクエストごとに設定できます。さらに、セッションの ID は、キー :id のオプション ハッシュ内にあります。その値を変更することは強くお勧めしません。
Rack::Utils::Context と互換性があります。
デフォルトでは含まれていません。使用するには「rack/session/abstract/id」が必要です。
ソース:
class ID
DEFAULT_OPTIONS = {
:key => 'rack.session',
:path => '/',
:domain => nil,
:expire_after => nil,
:secure => false,
:httponly => true,
:defer => false,
:renew => false,
:sidbits => 128,
:cookie_only => true,
:secure_random => (::SecureRandom rescue false)
}
これが手がかりになることを願っています...詳細がわかりましたら、ここで結果を共有できますか?
編集:
手品は、オプション:cookie_only => false
とを組み合わせること:defer => true
です。もちろん、標準の Rack::Session::Cookie はここではあまり意味がないので、次のようにすることもできます。
use Rack::Session::Pool, :cookie_only => false, :defer => true
興味深いことに、実行時にオプションを変更できます。私のユースケースでは、明示的なパラメーター受け渡しスタイルと一緒に従来の Cookie ベースのメカニズムを実際にサポートする必要があるため、次のことを行いました。
class WebApp < Sinatra::Base
configure do
use Rack::Session::Pool, :key => 'session_id'
end
before do
# Switch to parameter based session management if the client is an ios device
if env['HTTP_USER_AGENT'] =~ /iOS/
session.options[:cookie_only] = false
session.options[:defer] = true
end
end
get '/' do
session[:user_id] ||= nil # This triggers a session-write, giving us a valid session-id
body "session_id=#{session.id}"
end
end