Sun ONE ロゴ     前へ      目次      索引      次へ     
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() メソッドを使ってセッションを作成します。セッションが確立したら、所定のメソッドを使ってそのプロパティを調べたり、設定したりします。必要に応じて、非アクティブな状態が一定時間続いたあとでタイムアウトになるようにセッションを設定したり、セッションを手動で無効にしたりします。ほかのコンポーネントも使用できるように、オブジェクトを保存するセッションにバインドすることもできます。

セッションの作成またはセッションへのアクセス

新しいセッションを作成したり、既存のセッションにアクセスしたりするには、次の例に示すように HttpServletRequestgetSession() メソッドを使います。

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 のメソッド、右の列は各メソッドの説明です。

   HttpSession のメソッド 

HttpSession のメソッド

説明

getCreationTime()

 

セッション時刻を返す (1970 年 1 月 1 日 00:00:00 GMT 以降の時刻でミリ秒単位)

 

getId()

 

割り当てられたセッション識別子を返す。HTTP セッションの識別子は、サーバーが作成し管理する一意の文字列

 

getLastAccessedTime()

 

割り当てられたセッション識別子を持つ要求をクライアントが送信した最後の時刻を返す (1970 年 1 月 1 日 00:00:00 GMT 以降の時刻でミリ秒単位)。新しいセッションの場合は -1 を返す

 

isNew()

 

このセッションが新規と見なされるかどうかを示すブール値を返す。サーバーがセッションを作成し、クライアントがそのセッションに要求を送信していない場合は、新規のセッションになる。つまり、クライアントはセッションを「認識」または「結合」しておらず、次の要求を出すときに正しいセッション識別情報を返さない可能性がある

 

次に例を示します。

String mySessionID = mySession.getId();
if ( mySession.isNew() ) {
   log.println(currentDate);
   log.println("client has not yet joined session " + mySessionID);
}

次の表は、サーブレット要求のプロパティを検証するためのメソッドを示しています。左の列は HttpServletRequest のメソッド、右の列は各メソッドの説明です。

   HttpServletRequest のメソッド  

HttpServletRequest のメソッド

説明

getRemoteUser()

 

要求を出したユーザーの名前を取得する (HTTP 認証によって情報を取得)。要求にユーザー名の情報がない場合には NULL を返す

 

getRequestedSessionId()

 

この要求とともに指定されたセッション ID を返す。クライアントが指定したセッション ID が無効で新しいセッションが作成された場合は、現在のセッション内のセッション ID と異なる場合がある。要求に関連付けられたセッションがない場合は NULL を返す

 

isRequestedSessionIdValid()

 

この要求が現在有効なセッションに関連付けられているかどうかを確認する。要求されたセッションが有効でない場合、 getSession() メソッドからは返されない

 

isRequestedSessionIdFromCookie()

 

クライアントから指定された要求のセッション ID が cookie である場合は true を返し、それ以外の場合は false を返す

 

isRequestedSessionIdFromURL()

 

クライアントから指定された要求のセッション ID が URL の一部である場合は true を返し、それ以外の場合は false を返す

 

次に例を示します。

if ( request.isRequestedSessionIdValid() ) {
   if ( request.isRequestedSessionIdFromCookie() ) {
      // このセッションはセッション cookie 内で維持されます。
   }
   // 有効なセッションを必要とするほかのタスク
} else {
   // アプリケーションエラーを記録します。
}

セッションへのデータのバインド

複数のユーザー対話間で利用できるように、オブジェクトをセッションにバインドできます。

次の表は、オブジェクトをセッションオブジェクトにバインドするのをサポートする HttpSession のメソッドを示しています。左の列は HttpSession のメソッド、右の列は各メソッドの説明です。

   HttpSession のメソッド 

HttpSession のメソッド

説明

getAttribute()

 

セッション内の所定の名前にバインドされたオブジェクトを返す。バインドされたものがなければ NULL を返す

 

getAttributeNames()

 

セッションにバインドされたすべての属性の名前の配列を返す

 

setAttribute()

 

指定された名前を使って、指定されたオブジェクトをセッションにバインドする。同じ名前でバインドされている既存のオブジェクトは上書きされる。セッションにバインドされたオブジェクトを分散するには、serializable インタフェースを実装する必要がある

 

removeAttribute()

 

指定した名前を持つセッション内のオブジェクトのバインドを解除する。指定した名前のオブジェクトがバインドされていなければ、このメソッドの影響はない

 

HttpSessionBindingListener によるバインドの通知

オブジェクトによっては、セッションに入れられたとき、またはセッションから削除されたときにユーザーがそれを認識する必要があるものもあります。この情報を取得するには、これらのオブジェクト内に HttpSessionBindingListener インタフェースを実装します。アプリケーションがセッションにデータを格納したり、セッションからデータを削除するとき、サーブレットエンジンは、バインドまたはバインド解除されるオブジェクトが HttpSessionBindingListener を実装しているかどうかを確認します。このオブジェクトが HttpSessionBindingListener インタフェースを実装している場合、Sun ONE Application Server はこのインタフェースを介して、セッションにバインドされることやセッションからバインド解除されることをこのオブジェクトに通知します。

セッションの無効化

非アクティブな状態が一定時間続いたあとで、セッションが自動的に無効になるように指定できます。または、HttpSessioninvalidate() メソッドを使って手動でセッションを無効にすることもできます。



ヒント

セッションの 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 のプロパティを示します。左の列にプロパティの名前、中央の列にデフォルト値、右の列に各プロパティの説明を示します。

   manager-properties のプロパティ 

プロパティ名

デフォルト値

説明

reapIntervalSeconds

 

60

 

期限切れのセッションをチェックする周期を秒単位で指定する

セッションデータが変更される頻度より小さい値を設定することを推奨する。たとえば、頻繁にアクセスされる Web サイト上のヒットカウンタサーブレットの場合、この値をできるだけ小さくする必要がある (1 秒)。そうしないと、サーバーを再起動するたびに最後の数回分のヒットが失われる可能性がある

 

maxSessions

 

-1

 

アクティブセッションの最大数を指定する。制限しない場合は -1 (デフォルト値)

 

sessionFilename

 

なし。再起動すると、その前の状態は破棄される

 

アプリケーションの再起動の間にセッション状態を保持するファイルの絶対パスまたは相対パスを指定する (状態の保持が可能な場合)。相対パスは、この Web アプリケーションの一時ディレクトリを基準とした場所を示す

 

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 のプロパティを示しています。左の列にプロパティの名前、中央の列にデフォルト値、右の列にそのプロパティの説明を示します。

   manager-properties のプロパティ

プロパティ名

デフォルト値

説明

reapIntervalSeconds

 

60

 

期限切れのセッションをチェックする周期を秒単位で指定する

セッションデータが変更される頻度より小さい値を設定することを推奨する。たとえば、頻繁にアクセスされる Web サイト上のヒットカウンタサーブレットの場合、この値をできるだけ小さくする必要がある (1 秒)。そうしないと、サーバーを再起動するたびに最後の数回分のヒットが失われる可能性がある

 

maxSessions

 

-1

 

アクティブセッションの最大数を指定する。制限しない場合は -1 (デフォルト値)

 

PersistentManager のストアプロパティ

次の表は、PersistentManager セッションマネージャの store-properties のプロパティを示しています。左の列にプロパティの名前、中央の列にデフォルト値、右の列にそのプロパティの説明を示します。

   store-properties のプロパティ 

プロパティ名

デフォルト値

説明

reapIntervalSeconds

 

60

 

現在スワップアウトされているセッションについて期限切れをチェックする周期を秒単位で指定する

セッションデータが変更される頻度より小さい値を設定することを推奨する。たとえば、頻繁にアクセスされる Web サイト上のヒットカウンタサーブレットの場合、この値をできるだけ小さくする必要がある (1 秒)。そうしないと、サーバーを再起動するたびに最後の数回分のヒットが失われる可能性がある

 

directory

 

javax.servlet.context.tempdir コンテキスト属性によって指定されたディレクトリ

 

個々のセッションファイルが書き込まれるディレクトリの絶対パスまたは相対パスを指定する。相対パスは、この Web アプリケーションの一時作業ディレクトリを基準とした場所を示す

 


前へ      目次      索引      次へ     
Copyright 2002 Sun Microsystems, Inc. All rights reserved.