2007 年 2 月 27 日 1 時 19 分

Session


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


今日は、Session について調べる。

ビジネスアプリケーションには、
状態管理は必要不可欠である。

例えば、利用者のユーザ認証が必要な場合は、
その利用者によるアクセスを識別しなければならず、
データの変更や登録等の一連の処理の場合、
最低限、編集⇒確認⇒完了の 3 ステップについて、
同じ利用者が操作していることを確認しなければならない。

しかしながら、HTTP は状態を持たないプロトコルだ。
原則接続してきたクライアントを特定することはできず、
2 つのリクエストが、同じクライアントから要求されたかを、
検出するような方法も持たない。

HTTP がこのような性質を持つ以上、
状態管理や利用者追跡は、
アプリケーション側で全て行わなければならない。

Servlet API はこれらの必要性を考慮しており、
自動的な追跡機能を標準で搭載している。

・javax.servlet.http.HttpSession

HttpSession は「セッション」を表す。
セッションは、利用者の追跡と状態管理を行うクラスである。

Servlet コンテナにアクセスがあり、
Web アプリケーション開発者が望めば、
その利用者を追跡するためのセッションが作成される。

セッションには一意の ID が付与されており、
その ID は自動的に URL や Cookie に埋め込まれ、
次に同じ利用者がアクセスした際には、
その ID が提示されるような仕組みとなっており、
同じ利用者によるアクセスを自動的に検出することができる。

また、セッションは同一利用者の検出だけでなく、
状態管理に利用できるように、
自由な値を保存できるようになっている。

同じ利用者に対しては、同じ HttpSession が得られ、
HttpServletRequest や HttpServletResponse よりも
長い寿命を持っているため、利用者の操作状態の管理や、
利用者専用のデータ領域として自由に使うことができる。

Web アプリケーション開発者は、
HttpServletRequest の getSession() を呼び出すことで
現在のセッションを取得することができる。

さて、HttpSession を実装したクラスのインスタンスは、
「必要に応じて」Servlet コンテナが用意する。
一度作成された HttpSession オブジェクトは、
同じ利用者による複数のリクエストで共有されるため、
理論的には、アクセスしてきた一意ユーザの数だけ存在する。

ただし、これではセッションの数が爆発的に増加するため、
セッションには同時に存在できる数の制限や、
所有するユーザが一定時間アクセスしなかった場合、
自動的に破棄するタイムアウト等の設定が存在する。
また、コードで自由なタイミングに破棄することもできる。

つまり、HttpSession の寿命を決めるのは開発者である。
通常は、ログイン処理などのタイミングで作成し、
ログアウト(またはタイムアウト)時に破棄することが多い。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.