Sun ONE Application Server 7 Web アプリケーション開発者ガイド |
ユーザーセッションの作成と管理このmoduleでは、対話間におけるユーザーおよびトランザクションの情報を継続的に維持できるセッションを作成し、管理する方法について説明します。
このmoduleには次の節があります。
セッションについて
ユーザーセッションという用語は、サーバーが記録するユーザーとアプリケーション間の一連の対話を意味します。セッションは、持続性のあるオブジェクト (EJB コンポーネントやデータベース結果セットへのハンドルなど) や認証されたユーザー ID などのユーザー固有の状態を多数の対話間で維持するために使われます。たとえば、検証されたユーザーログインと、そのあとにそのユーザーに対して指示された一連のアクティビティを記録するためにセッションを使用できます。
セッション自体はサーバー内に存在します。クライアントは、要求ごとに、cookie 内のセッション ID を送信します。または、ブラウザが cookie を許可しない場合、サーバーは自動的にセッション ID を URL に書き込みます。
Sun ONE Application Server はすべてのセッションアクティビティに対して、HttpSession と呼ばれるサーブレットの標準セッションインタフェースをサポートしています。このインタフェースによって移植可能で安全なサーブレットを作成できます。
セッションと cookie
cookie は、サーバーが同じクライアントからの呼び出しかを認識できるように、呼び出し側のブラウザに送信され、後続の呼び出しのたびに取り出される小さな情報の集まりです。cookie は、期限切れになるまで、それを作成したサイトを呼び出すたびに返されます。
セッションは、その最初の作成時にクライアントに送信されるセッション cookie によって自動的に維持されます。セッション cookie には、継続的な各対話でブラウザに接続するクライアントを識別するセッション ID が含まれています。クライアントが cookie をサポートしない場合や許可しない場合、サーバーはセッション ID がそのクライアントからの URL 内に現れている部分の URL を書き換えます。
セッションで cookie を使用するかどうかや、どのように使用するかを設定できます。sun-web.xml ファイル内の session-properties 要素と cookie-properties 要素については、「Web モジュールの構築と配備」を参照してください。
セッションと URL の書き換え
Sun ONE Application Server プラグインが URL を暗黙的に書き換える状況には、次の 2 つがあります。
- Sun ONE Application Server から応答があったとき。URL を暗黙的に書き換えるよう指定されている場合、プラグインは応答をクライアントに渡す前に URL を書き換える
- クライアントからの要求が Sun ONE Application Server に送信される必要がなく、Web サーバーサイドで処理できるとき。このような要求はセッションの途中で発生する可能性があり、応答が必要ない場合がある
セッションで URL の書き換えを使用するかどうかを設定できます。sun-web.xml ファイル内の session-properties 要素については、「Web モジュールの構築と配備」を参照してください。
セッションとセキュリティ
Sun ONE Application Server のセキュリティモデルは、認証されたユーザーセッションをベースにしています。セッションが作成されると、アプリケーションユーザーは認証を受け (ユーザー認証が使用される場合)、そのセッションにログインします。EJB 要求を受け取るサーブレットの対話の各ステップでは、JSP で出力をフォーマット化するためのコンテンツを生成するほか、ユーザーが正しく認証されていることを確認します。
さらに、セッション cookie が保護された接続 (HTTPS) だけに渡されるように指定できます。したがって、安全なチャンネル上に限りセッションをアクティブな状態で維持できます。
セキュリティの詳細については、「Web アプリケーションのセキュリティ」を参照してください。
セッションの使用法
セッションを使うには、まず HttpServletRequest メソッドの getSession() メソッドを使ってセッションを作成します。セッションが確立したら、所定のメソッドを使ってそのプロパティを調べたり、設定したりします。必要に応じて、非アクティブな状態が一定時間続いたあとでタイムアウトになるようにセッションを設定したり、セッションを手動で無効にしたりします。ほかのコンポーネントも使用できるように、オブジェクトを保存するセッションにバインドすることもできます。
セッションの作成またはセッションへのアクセス
新しいセッションを作成したり、既存のセッションにアクセスしたりするには、次の例に示すように HttpServletRequest の getSession() メソッドを使います。
HttpSession mySession = request.getSession();
getSession() は、要求に関連付けられた正当なセッションオブジェクトを返します。このセッションオブジェクトは、要求オブジェクト内にカプセル化されているセッション cookie 内で識別されます。引数を指定せずにこのメソッドを呼び出すと、要求に関連付けられているセッションがまだ存在していない場合にはセッションが作成されます。さらに、ブール値の引数でメソッドを呼び出すと、その引数が true の場合だけ、セッションが作成されます。
次の例は、サーブレットの doPost() メソッドを示しています。このメソッドは、セッションが存在する場合だけ サーブレットの主な関数を実行します。getSession() に false パラメータを指定すると、セッションがまだ存在しない場合でもサーブレットは新しいセッションを作成しないので注意してください。
public void doPost (HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
{
if ( HttpSession session = req.getSession(false) )
{
// セッションが取得されたので、サーブレットのオペレーションを続行します。
}
else
// セッションがないので、エラーページが返されます。
}
}
注 getSession() メソッドは、応答ストリームに書き込みが行われる前に呼び出す必要があります。書き込みの前に呼び出さないと、SetCookie 文字列は、HTTP ヘッダーではなく HTTP 応答の本体に配置されます。
getSession() の詳細については、Java サーブレット仕様バージョン 2.3 を参照してください。
セッションプロパティの調査
セッション ID を確立したら、HttpSession インタフェース内のメソッドを使って、セッションのプロパティを調べ、HttpServletRequest インタフェース内のメソッドを使ってそのセッションに関連する要求プロパティを調べます。
次の表は、セッションのプロパティを検証するためのメソッドを示しています。左の列は HttpSession のメソッド、右の列は各メソッドの説明です。
次に例を示します。
String mySessionID = mySession.getId();
if ( mySession.isNew() ) {
log.println(currentDate);
log.println("client has not yet joined session " + mySessionID);
}次の表は、サーブレット要求のプロパティを検証するためのメソッドを示しています。左の列は HttpServletRequest のメソッド、右の列は各メソッドの説明です。
次に例を示します。
if ( request.isRequestedSessionIdValid() ) {
if ( request.isRequestedSessionIdFromCookie() ) {
// このセッションはセッション cookie 内で維持されます。
}
// 有効なセッションを必要とするほかのタスク
} else {
// アプリケーションエラーを記録します。
}セッションへのデータのバインド
複数のユーザー対話間で利用できるように、オブジェクトをセッションにバインドできます。
次の表は、オブジェクトをセッションオブジェクトにバインドするのをサポートする HttpSession のメソッドを示しています。左の列は HttpSession のメソッド、右の列は各メソッドの説明です。
HttpSessionBindingListener によるバインドの通知
オブジェクトによっては、セッションに入れられたとき、またはセッションから削除されたときにユーザーがそれを認識する必要があるものもあります。この情報を取得するには、これらのオブジェクト内に HttpSessionBindingListener インタフェースを実装します。アプリケーションがセッションにデータを格納したり、セッションからデータを削除するとき、サーブレットエンジンは、バインドまたはバインド解除されるオブジェクトが HttpSessionBindingListener を実装しているかどうかを確認します。このオブジェクトが HttpSessionBindingListener インタフェースを実装している場合、Sun ONE Application Server はこのインタフェースを介して、セッションにバインドされることやセッションからバインド解除されることをこのオブジェクトに通知します。
セッションの無効化
非アクティブな状態が一定時間続いたあとで、セッションが自動的に無効になるように指定できます。または、HttpSession の invalidate() メソッドを使って手動でセッションを無効にすることもできます。
ヒント セッションの API には明示的なセッションログアウト API はありません。したがって、ログアウトを実行するには session.invalidate() API を呼び出す必要があります。
手動によるセッションの無効化
手動でセッションを無効にするには、次のメソッドを呼び出します。
session.invalidate();
セッションにバインドされたオブジェクトはすべて削除されます。
セッションタイムアウトの設定
セッションタイムアウトは、sun-web.xml 配備記述子ファイルを使って設定します。詳細については、「Web モジュールの構築と配備」の session-properties 要素を参照してください。
セッションマネージャ
セッションマネージャは、新しいセッションが開始されるたびに、新しいセッションオブジェクトを自動的に作成します。状況によっては、クライアントがセッションに参加しないこともあります。たとえば、セッションマネージャは cookie を使用するがクライアントは cookie を受け入れない場合などです。
Sun ONE Application Server 7 には、次のようなセッション管理オプションが用意されています。
- StandardManager (デフォルトのセッションマネージャ)
- PersistentManager (持続性のあるデータストアを使用する、付属のセッションマネージャ)
注 セッションマネージャインタフェースは不確定なインタフェースです。不確定なインタフェースは試験的または一時的なインタフェースであるため、次のリリースで互換性がなくなったり、削除されたり、または安定したインタフェースに置き換えられたりする場合があります。
StandardManager
StandardManager はデフォルトのセッションマネージャです。
StandardManager の有効化
StandardManager を明示的に指定して、そのデフォルトパラメータを変更することもできます。そのためには、Web アプリケーションの sun-web.xml ファイルを、次の例のように編集します。
<sun-web-app>
...
<session-config>
<session-manager>
<manager-properties>
<property name="reapIntervalSeconds" value="20" />
</manager-properties>
</session-manager>
...
</session-config>
...
</sun-web-app>sun-web.xml ファイルの詳細については、「Web モジュールの構築と配備」を参照してください。
StandardManager のマネージャプロパティ
次の表は、StandardManager セッションマネージャの manager-properties のプロパティを示します。左の列にプロパティの名前、中央の列にデフォルト値、右の列に各プロパティの説明を示します。
PersistentManager
PersistentManager は、Sun ONE Application Server に付属しているもう 1 つのセッションマネージャです。セッションの持続性を実現するために、PersistentManager はファイルを使用し、そこに各セッションを直列化します。ユーザー独自の持続性メカニズムを作成することもできます。
PersistentManager の有効化
PersistentManager を明示的に指定して、そのデフォルトパラメータを変更することもできます。そのためには、Web アプリケーションの sun-web.xml ファイルを、次の例のように編集します。persistence-type には file を設定する必要があります。
<sun-web-app>
...
<session-config>
<session-manager persistence-type=file>
<manager-properties>
<property name=reapIntervalSeconds value=20 />
</manager-properties>
<store-properties>
<property name=directory value=sessions />
</store-properties>
</session-manager>
...
</session-config>
...
</sun-web-app>sun-web.xml ファイルの詳細については、「Web モジュールの構築と配備」を参照してください。
PersistentManager のマネージャプロパティ
次の表は、PersistentManager セッションマネージャの manager-properties のプロパティを示しています。左の列にプロパティの名前、中央の列にデフォルト値、右の列にそのプロパティの説明を示します。
PersistentManager のストアプロパティ
次の表は、PersistentManager セッションマネージャの store-properties のプロパティを示しています。左の列にプロパティの名前、中央の列にデフォルト値、右の列にそのプロパティの説明を示します。