誰かが同じニーズで実行している場合は、アプリケーション内でセッションを管理するためのクラスを作成するのが最も簡単な方法であることがわかりました。
Rack ::Utilsには2つの優れたショートカットがあります。Rack::Utils.set_cookie_header!およびUtils.delete_cookie_header!これにより、Cookieを処理する際の作業が非常に簡単になります。
アプリケーションを使用してデータベースにセッションを保存していますが、別のバックエンドをサポートするのは簡単なはずです。
補足として、私が持ってきたいくつかの考慮事項:
- Cookieの名前が有効であることを確認するために、その目的でサブアプリケーション名のsha-1を使用しています。
- SecureRandom.urlsafe_base64は、セッションキーの生成に役立ちます。
- セッションのクリーニングと更新は手動で実装する必要があります。
サンプルコード
クッキーを管理するクラス、コミット機能は、ラックにクッキーを設定および削除します。
class Framework::Response::Cookies
def set( params )
@cookies[params.delete( :name )] = params
end
def remove( params )
@remove_cookies[params.delete( :name )] = params
end
def commit( headers )
@cookies.each_pair do |name, params|
Rack::Utils.set_cookie_header!( headers, name, params )
end
@remove_cookies.each_pair do |name, params|
Rack::Utils.delete_cookie_header!( headers, name, params )
end
end
end
セッションを管理するクラス(バックエンドとしてMongoを使用):
class Database::Mongo::Session < Session
def save
expire = Time.now + @session_ttl
@framework.content.db.find_and_modify( self.collection_name, {
:query => { :name => @session_name, :id => @session_id },
:update => { :expire => expire, :name => @session_name, :id => @new_session_id || @session_id , :variables => @variables.to_hash },
:upsert => true
})
@framework.response.cookies.set(
:name => @session_name,
:value => @new_session_id || @session_id,
:path => @framework.applications.active.active_request['path'],
:domain => @framework.applications.active.active_request['host'],
:httponly => true
)
end
def delete
@framework.content.db.remove( self.collection_name, { :id => @session_id } )
@framework.response.cookies.remove( :name => @session_name )
end
end
が呼び出されるたび@framework.response.cookies.set
に、CookieデータがFramework::Response::Cookies
クラス@cookies
変数にプッシュされます。
応答を提供する前に、Framework::Response::Cookies.commit
を使用してCookieをコミットするための呼び出しRack::Utils
。