Class CGIKit::Session
In: docs/rdoc_ja.rb
Parent: Object

CGIKit::Sessionはセッションを扱うクラスです。 セッションはHTTPトランザクションを超えて任意のオブジェクトを保持できます。 CGIKitではセッションにコンポーネントを格納しておくことで、 ステートフルな動作や状態を操作するエレメントを実現しています。

CGIKit::Sessionは次のデータを管理しています。

  • 任意のオブジェクト
  • コンポーネント
  • ブラウザ名
  • IPアドレス

セッション管理

生成

セッションは状況に応じて自動的に生成されます。

  • Component, DirectActionのsession属性にアクセスしたとき
  • コンポーネントを使っているとき (リクエストハンドラがComponentRequestHandlerのとき)
  • フォームやaction属性を設定したリンクなど、 ステートフルな処理が必要なエレメントを使ったとき

しかしセッションにはブックマークできないことや負荷がかかるなどの欠点があり、 セッションを生成したくない場合もあります。 その場合は上記のセッションが生成される状況を避ける必要があります。

  • Component, DirectActionのsession属性にアクセスしない (セッションの有無を調べるには別のメソッドを使います)
  • ダイレクトアクションを使う
  • フォームやaction属性を設定したリンクなど、 ステートフルな処理が必要なエレメントを使わない

保存

生成されたセッションは、フレームワークによって保存されます。 どのように保存されるかは、保存に使われるセッションストア (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から、自動的に復元されます。

削除

セッションは次のときに削除されます。

  • terminate() を実行する
  • タイムアウトしたセッションにアクセスする

タイムアウトしたセッションは、そのままでは削除されません。 アプリケーションを使うにつれ、セッションファイルやメモリの使用量が増えていきます。 タイムアウトしたセッションを削除するために、特別なダイレクトアクションと コマンドラインツール (cksweep) が用意されています。 詳しくは DirectAction を参照してください。

セッションIDの保管

セッション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アドレスで認証を行うことができます。 セッション生成時と異なるブラウザやIPアドレスでセッションにアクセスすると、 例外Application::SessionAuthorizationErrorを発生します。

認証方法は以下の属性で設定します。trueのとき有効になります。

auth_by_user_agent:ブラウザによる認証を行う。
auth_by_remote_addr:IPアドレスによる認証を行う。

Methods

Included Modules

Logging

Constants

DEFAULT_SESSION_ID_FIGURES = 16
DEFAULT_TIMEOUT = 604800

External Aliases

editing_context -> ec
values -> []
values= -> []=

Attributes

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]  セッションが保持する任意のオブジェクトのハッシュ。

Public Class methods

Public Instance methods

このメソッドはフレームワークが使うので、使わないでください。

このメソッドはフレームワークが使うので、使わないでください。

セッションの復元後、初期化するために呼ばれます。 各属性を application から取得し、最終アクセス時刻を更新します。

component( context_id )

このメソッドはフレームワークが使うので、使わないでください。

このメソッドはフレームワークが使うので、使わないでください。

コンポーネントIDを返します。

セッションを削除します。 セッションストアからセッションを削除し、 レスポンスにセッションID削除用のクッキーをセットします。 このメソッドはフレームワークが使うので、使わないでください。

初期化用のフックメソッドです。

新しいコンポーネントIDを返します。

IPアドレスが等しければ真を返します。

See Also: remote_addr, user_agent?

key に対応するオブジェクトを取り除きます。

See Also: values

期限切れのクッキーをレスポンスにセットし、クッキーを削除します。

See Also: terminate, flush

context_id からコンポーネントを復元します。 該当するコンポーネントがなければ nil を返します。

See Also: save_page

コンポーネントを保存します。 permanently が真であれば永続的ページキャッシュに、 そうでなければ通常のページキャッシュに保存します。

See Also: restore_page

セッションIDを保存するためのクッキーをレスポンスにセットします。

セッションを終了し、無効にします。 リクエスト・レスポンスループの終了後、セッションは削除されます。

See Also: terminate?, flush

セッションが無効であれば真を返します。

See Also: terminate

セッションがタイムアウトであれば真を返します。

See Also: timeout, timeout_expire

最終アクセス時刻から計算した、セッションがタイムアウトする時刻を返します。

See Also: timeout, timeout?

ブラウザ名が等しければ真を返します。

See Also: user_agent, remote_addr?

ブラウザ・IPアドレスによる認証と、タイムアウトを検証します。 認証に失敗するか、タイムアウトであれば例外を発生します。

See Also: validate_authorization, validate_timeout

ブラウザ・IPアドレスによる認証を行います。 認証に失敗すると例外を発生します。

See Also: validate, user_agent?, remote_addr?

タイムアウトを検証します。 タイムアウトであれば例外を発生します。

See Also: validate, timeout?

[Validate]