Class | CGIKit::Session |
In: |
docs/rdoc_ja.rb
|
Parent: | Object |
CGIKit::Sessionはセッションを扱うクラスです。 セッションはHTTPトランザクションを超えて任意のオブジェクトを保持できます。 CGIKitではセッションにコンポーネントを格納しておくことで、 ステートフルな動作や状態を操作するエレメントを実現しています。
CGIKit::Sessionは次のデータを管理しています。
セッションは状況に応じて自動的に生成されます。
しかしセッションにはブックマークできないことや負荷がかかるなどの欠点があり、 セッションを生成したくない場合もあります。 その場合は上記のセッションが生成される状況を避ける必要があります。
生成されたセッションは、フレームワークによって保存されます。 どのように保存されるかは、保存に使われるセッションストア (SessionStoreのサブクラス) によって異なります。
FileSessionStore: | ファイルに保存する |
MemorySessionStore: | メモリに保存する |
セッションストアは Application#session_store_class で設定します。
ハッシュ形式でデータの取得と保存を行います。
session['key'] = 'value' session['array'] = [1,2,3,4,5] p session['key'] #-> 'value' p session['array'] #-> [1,2,3,4,5]
セッションに保存できるオブジェクトは、保存に使うクラスによって異なります。 CGI用の保存クラス FileSessionStore では、 Marshalできないオブジェクト (IO、Procなど) を格納することはできません。 コンポーネントはオブジェクトごとがセッションに保存されますので、 インスタンス変数にMarshalできないオブジェクトを保持したままにしないでください。
リクエスト (URL) に含まれるセッションIDから、自動的に復元されます。
セッションは次のときに削除されます。
タイムアウトしたセッションは、そのままでは削除されません。 アプリケーションを使うにつれ、セッションファイルやメモリの使用量が増えていきます。 タイムアウトしたセッションを削除するために、特別なダイレクトアクションと コマンドラインツール (cksweep) が用意されています。 詳しくは DirectAction を参照してください。
セッションIDはURLまたはクッキーを使って保管します。 このとき発行されるクッキーの有効期限はsession_cookie_expiresで設定できます。
保管方法は以下の属性で設定します。
store_in_url: | セッションIDをURLに埋め込む。デフォルトは true 。 |
store_in_cookie: | セッションIDをクッキーに埋め込む。デフォルトは true 。 |
session_cookie_expires: | セッションIDの保存に使うクッキーの有効期限。 nilに設定した場合、ブラウザを閉じるとクッキーは削除される。 デフォルトは 604800 (1週間) 。 |
セッションは生成されたコンポーネントを次の二種類に分けて保持しています。 どちらのキャッシュも、一定数を越えると古いものから順に削除されます。
ページ表示に使われるコンポーネントが自動的に保存されるのが一時的キャッシュ、 任意のコンポーネントを保持できるのが永続的キャッシュです。
コンポーネントは新しいページの表示が繰り返されると 一時的キャッシュから消えてしまう可能性があるので、 長期間使う必要のある場合は永続的キャッシュに保存しておきます。
例: 永続的キャッシュにコンポーネントを追加する
class MainPage < CGIKit::Component def new_page page = page(NextPage) session.save_page(page, true) # trueで永続的キャッシュに保存 page end end
キャッシュ数は Application#page_cache_size で変更できます。
セッションには有効期限を設定することができます。 有効期限が経過したセッションでアクセスすると、 例外Application::SessionTimeoutErrorを発生します。
有効期限はApplication#timeout属性に秒数で指定します。 セッションに最後にアクセスした時間からtimeout秒後がタイムアウトになります。 セッションを無期限に有効にしたい場合は、timeout属性に0を設定してください。 また、指定されたセッションIDが存在しない場合もタイムアウト扱いになります。
ユーザーのブラウザとIPアドレスで認証を行うことができます。 セッション生成時と異なるブラウザやIPアドレスでセッションにアクセスすると、 例外Application::SessionAuthorizationErrorを発生します。
認証方法は以下の属性で設定します。trueのとき有効になります。
auth_by_user_agent: | ブラウザによる認証を行う。 |
auth_by_remote_addr: | IPアドレスによる認証を行う。 |
DEFAULT_SESSION_ID_FIGURES | = | 16 |
DEFAULT_TIMEOUT | = | 604800 |
editing_context | -> | ec |
values | -> | [] |
values= | -> | []= |
application | [RW] | CGIKit::Applicationオブジェクト。 |
auth_by_remote_addr | [RW] | IPアドレスによる認証をするかどうか。 |
auth_by_user_agent | [RW] | ブラウザ名による認証をするかどうか。 |
caches | [RW] | ページ (コンポーネント) キャッシュ。 |
context | [RW] | CGIKit::Contextオブジェクト。 |
context_ids | [RW] | コンテキストIDとコンポーネントを対応させたハッシュ。 キーがコンテキストID、値がコンポーネント。 |
cookie_expires | [RW] | クッキーの有効期限。 |
editing_context | [RW] | |
frame_components | [RW] | |
last_accessed_time | [RW] | セッションへの最終アクセス時刻。 |
permanent_caches | [RW] | 永続的ページキャッシュ。 |
remote_addr | [RW] | IPアドレス。 |
session_id | [RW] | セッションID。 |
session_key | [RW] | クッキーの保存に使うセッションキー。 |
session_store | [RW] | CGIKit::SessionStoreオブジェクト。 |
store_in_cookie | [RW] | セッションIDをクッキーに保管するかどうか。 |
store_in_url | [RW] | セッションIDをURLに保管するかどうか。 |
timeout | [RW] | セッションがタイムアウトするまでの時間 (秒) 。 |
user_agent | [RW] | ブラウザ名。 |
values | [RW] | セッションが保持する任意のオブジェクトのハッシュ。 |
CGIKit::Componentに転送します。
See Also: take_values_from_request, append_to_response
context_id からコンポーネントを復元します。 該当するコンポーネントがなければ nil を返します。
See Also: save_page
コンポーネントを保存します。 permanently が真であれば永続的ページキャッシュに、 そうでなければ通常のページキャッシュに保存します。
See Also: restore_page
CGIKit::Componentに転送します。
See Also: invoke_action, append_to_response
ブラウザ・IPアドレスによる認証と、タイムアウトを検証します。 認証に失敗するか、タイムアウトであれば例外を発生します。
See Also: validate_authorization, validate_timeout
ブラウザ・IPアドレスによる認証を行います。 認証に失敗すると例外を発生します。
See Also: validate, user_agent?, remote_addr?