ヘッダーをスキップ

Oracle Containers for J2EE サーブレット開発者ガイド
10g(10.1.3.1.0)

B31859-01
目次
目次
索引
索引

戻る 次へ

3 サーブレット・セッションの理解および使用方法

複数のリクエストおよびレスポンスについてユーザーの状態情報の追跡に使用されるサーブレット・セッションの概要は、「サーブレット・セッション(ユーザー・セッション)の使用目的」で示しました。次の項では、セッション属性およびCookieの使用を含む詳細と例を提供します。

セッション・トラッキングの概要

OC4Jのサーブレット・コンテナは、サーブレット仕様に従い、HTTPセッション・オブジェクト(javax.servlet.http.HttpSessionインタフェースを実装するクラスのインスタンス)によってセッション・トラッキングを実装します。(このクラスはOC4Jサーブレット・コンテナによって提供されます。)サーブレットでHTTPセッション・オブジェクトを作成する場合、クライアントの相互作用はステートフルであるとみなされます。

セッション・オブジェクトは、値(Javaオブジェクト)を関連付けられたキー(Java文字列)とともに格納したり、名前(Java文字列)を格納したりするディクショナリと考えることができます。それぞれの名前/値ペアは、セッション属性を構成します。

次の項では、セッション・オブジェクトおよびその他のセッション・トラッキング機能について説明します。

セッション・オブジェクト

サーブレットは、HTTPリクエスト・オブジェクトのgetSession()メソッドを使用して、HTTPセッション・オブジェクトを取得または作成します。 このメソッドは、ブール引数を取得して、オブジェクト・セッションがアプリケーション内に存在しない場合に、クライアントに対して新規セッション・オブジェクトを作成する必要があるかどうかを指定します。セッション・オブジェクトの属性を使用すると、setAttribute()およびgetAttribute()メソッドにより、ユーザー・セッションに関連するデータを格納および取得できます。 「サーブレットでのセッション・オブジェクトの使用方法」を参照してください。

セッション・オブジェクトを使用して、アプリケーション間でデータを共有したり、同一アプリケーションの異なるクライアント間でデータを共有したりすることはできません。1つのアプリケーションの1つのクライアント当たり1つのHTTPセッション・オブジェクトが存在します。

セッションID

特定のセッションと適切なセッション・オブジェクトとのマッピングを維持して、現在のセッションの情報に適切にアクセスできるようにするために、OC4Jは、セッションごとに一意のセッションIDを生成します。ステートフル・サーブレット(基本的に、セッション・オブジェクトを作成したサーブレット)がクライアントにレスポンスを返す際に、OC4Jによって生成されたセッションIDがレスポンスにインクルードされます。Cookieが有効な場合、OC4Jは、セッションID Cookieを使用してこれを実行します。 「OC4Jがセッション・トラッキングにCookieを使用する方法」を参照してください。

Cookieが無効な場合、セッションIDはURLリライティングによって通信され、HTTPレスポンス・オブジェクトのencodeURL()メソッド(インクルードまたは転送の場合はencodeRedirectURL()メソッド)をコールする必要があります。 「セッション・トラッキングのためのURLリライティングの使用」を参照してください。

Cookieおよび永続セッション・データ

セッション・データを永続データにする場合、保護、トランザクションの安全性、およびデータベースによるバックアップ機能が必要であれば、その永続データをデータベースに格納できます。データ量が少なく、データベース機能が不要なときは、独自のCookieを作成して使用するか、多くの場合、ファイル・システムまたはその他のリモート・オブジェクトを使用することができます。

Cookieは名前と単一の関連値を持ち、HTTPのリクエスト・ヘッダーおよびレスポンス・ヘッダーの属性として格納されます。 「サーブレットでのCookieの使用方法」を参照してください。

Cookieまたはセッション属性を使用する場面

セッション・データは、一般に、セッション・オブジェクトの属性を使用して格納および操作されますが、データ量が少ない場合、特に永続データにしようとしている情報については、Cookieを作成して使用することもできます。セッション属性のかわりにCookieを使用するかどうかは好みや意図の問題ですが、次の点を考慮してください。

たとえば、業務関連のデータにセッション属性を使用し、プレゼンテーション関連のデータにCookieを使用するという方針を立てることができます。Cookieは、表示内容や表示方法をサーブレットに通知し同じユーザーの後続のセッション間で変更されにくい情報(ユーザーに関する情報など)を示すことができます。

OC4Jでのセッション・トラッキングの使用方法

次の項では、セッション・トラッキングのためのOC4Jの主な機能について説明します。

セッション・トラッキングの構成とOC4JでのCookieの有効化または無効化

OC4Jは、global-web-application.xmlまたはorion-web.xmlファイルの<session-tracking>要素の設定に基づいてセッション・トラッキングを実行します。

サーブレット・コンテナは、最初にCookieを使用してセッション・トラッキングを試行します。Cookieが無効な場合、セッション・トラッキングの維持に使用できるのは、URLリライティング、レスポンス・オブジェクトのencodeURL()メソッド、もしくは転送またはインクルード用のencodeRedirectURL()メソッドのみです。Cookieが無効化されている場合は、サーブレットにencodeURL()コールまたはencodeRedirectURL()コールを含める必要があります。 「セッション・トラッキングのためのURLリライティングの使用」を参照してください。

Cookiesは、デフォルトでは、<session-tracking>の設定のcookies="enabled"を反映して有効になっています。cookies="disabled"に設定すると、Cookieは無効になります。

<session-tracking cookies="disabled" ... >
   ...
</session-tracking>


注意

Application Server Controlデプロイ・プラン・エディタのsessionTrackingプロパティによって、Cookieを明示的に有効または無効にすることができます(『Oracle Containers for J2EEデプロイメント・ガイド』を参照)。 


また、<session-tracking><session-tracker>サブ要素の設定に基づいて、1つ以上のセッション・トラッカ・サーブレットを指定することもできます。セッション・トラッキングは、たとえば、ログを記録する場合に役立ちます。global-web-application.xmlではなく、orion-web.xmlですべてのセッション・トラッカを定義する必要があります。これは、<session-tracker>要素が同じアプリケーション内で定義される1つのサーブレットを指し示すためです。セッション・トラッカは、セッションが作成されると同時に起動されます。特に、HTTPセッション・リスナー(javax.servlet.http.HttpSessionListenerインタフェースを実装するクラスのインスタンス)のsessionCreated()メソッドが起動されると同時に起動されます。 セッション・リスナーの詳細は、第5章「イベント・リスナーの理解および使用方法」を参照してください。

「<session-tracking>」および「<session-tracker>」も参照してください。

OC4Jがセッション・トラッキングにCookieを使用する方法

Cookieが有効な場合、OC4Jは、次のように、セッション・トラッキングCookieを使用します。

  1. サーブレット・コンテナでは、セッション作成後のサーブレットへの最初のレスポンスとともに、セッションIDを含むCookieをクライアントに返信します。多くの場合、Cookieにはその他の少量の有用な情報(すべて4KB未満)も含まれています。コンテナは、JSESSIONIDという名前のCookieをHTTP Set-Cookieレスポンス・ヘッダーで送信します。

  2. その後、同じWebクライアント・セッションから後続のリクエストを受信するたびに、クライアントはそのCookieをリクエストの一部としてHTTP Cookieリクエスト・ヘッダーでサーバーに返信します。サーバーではCookieの値を使用してセッションの状態情報をルックアップし、サーブレットに渡します。

  3. コンテナは、後続のレスポンスとともに、更新済のCookieをクライアントに返信します。

このCookieを送信するためのサーブレット・コードは不要です。送信はコンテナで自動的に処理されます。Cookieのサーバーへの返信は、Webブラウザで自動的に処理されます。

「保護された接続によるセッション・トラッキング」も参照してください。

セッション・トラッキングのためのURLリライティングの使用

Cookieにかわるものとして、HTTPレスポンス・オブジェクトのencodeURL()メソッド(インクルードまたは転送の場合は、同等の、encodeRedirectURL()メソッド)を使用するURLリライティングがあります。このメカニズムにより、OC4Jは、Cookieが無効になっている場合に、セッションIDをURLパスにエンコードすることができます。次の条件が満たされている必要があります。

サーブレット・コンテナが確実にURLリライティングを使用できるようにするために、出力ストリームにURLを書き込む際は、URLを直接書き込むのではなく、必ず、encodeURL()を使用してください。 次に例を示します。

out.println("Click <a href=" + res.encodeURL(req.getRequestURL().toString()) +
            ">this link</a>");
out.println(" to access this page again.<br>");

OC4Jは、次の例のように、パラメータのjsessionid(サーブレット仕様に準拠)を使用して、URLパスでセッションIDを示します。

http://www.example.com:port/myapp/index.html?jsessionid=6789

Cookieの機能と同様に、サーバーでは再書込みされたURLの値を使用してセッションの状態情報をルックアップし、サーブレットに渡します。

サーブレット仕様に従い、Cookieが有効な場合、encodeURL()メソッドとencodeRedirectURL()メソッドのコールによってアクションは実行されません。


注意

  • サーブレット2.0のencodeUrl()メソッドは使用できないため、encodeURL()メソッド(大文字化に注意)に置換されました。

  • OC4Jでは、サーブレット・コンテナでセッションIDを自動的にURLにエンコードする、自動エンコーディングはサポートしていません。これは、多くのリソースを消費する標準外の処理です。

 

保護された接続によるセッション・トラッキング

OC4Jとクライアントの間での交換に機密情報が含まれる場合は、保護された接続を使用して送信する必要があります。 これには、HTTPSを使用できます(HTTPSではSSLソケットを使用してHTTPプロトコルが送信されます。詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください)。この場合、セッションIDが傍受されたり、なりすましが行われたりする可能性があるCookieまたはURLリライティングは、セッションIDの送信には適していません。セッションIDの値の信頼性が失われると、関連するセッションが脆弱性を持ちます。

すべての送信にHTTPSが使用されるこの保護された送信状況では、OC4Jは、セッション状態を取得するために必要な情報を、SSLセッションの属性(ユーザーには表示されない機能)として、直接SSL接続に格納します。これにより、セッション状態に対して最大限のセキュリティが提供されますが、セッション状態の存続期間もSSL接続自体の存続期間に結び付けられます。SSL接続が切断されると、セッション状態が失われます。

アプリケーションは、HTTPとHTTPSによって共有される可能性もあります。 (詳細は、「スタンドアロンOC4JのHTTPおよびHTTPSでアプリケーションを使用可能にする方法」を参照してください。)アプリケーションがこのように共有される場合は、OC4Jが、アプリケーションへの送信をSSL接続経由で行うことができるかどうかを判定します。セッション情報を格納できる保証されたSSL接続がない場合、OC4Jは、前述のように、セッション・トラッキングにCookieまたはURLリライティングを使用する状態に戻ります。


注意

一部の古いブラウザでは、特定の状況でSSL接続が切断され、セッション状態を継続して取得できなくなったり、場合によっては、セッション状態が突然消失することがあります。このような場合は、アプリケーションを共有するように指定して、セッション・トラッキングにCookieまたはURLリライティングを強制的に使用することにより、問題を回避できます。安全性が低下しますが、これが実行可能な唯一の代替方法です。 


スタンドアロンOC4JのHTTPおよびHTTPSでアプリケーションを使用可能にする方法

スタンドアロンOC4Jにおいて単一のアプリケーションを2つのプロトコル経由で使用できるようにするには、そのアプリケーションを2つの異なるWebサイトのXMLファイルで宣言し、共有のマークを付ける必要があります。この機能は、各WebサイトのXMLファイルで、<web-app>要素のshared属性がtrueに設定されている場合に有効になります。アプリケーションを共有するように設定すると、アプリケーションが宣言されている各Webサイトに対して定義されているプロトコル経由で単一のアプリケーションのデプロイが可能になります。HTTPとHTTPSで共有する場合、1つのWebサイトはHTTPS用に構成および保護され、別のWebサイトはHTTP用に構成および保護されなくなります。

OC4Jの共有アプリケーションに関する追加情報は、『Oracle Containers for J2EE構成および管理ガイド』を参照してください。

サーブレットでのセッション・オブジェクトの使用方法

この項では、セッション・オブジェクトの属性の使用方法を示します。最初にHttpSessionインタフェースの主要メソッドをまとめ、次にgetterおよびsetterメソッドによるセッション属性の作成および取得について説明し、最後に例を示します。

HttpSessionメソッドのサマリー

サーブレット・コンテナはユーザー・セッションのデータの管理に、HTTPセッション・オブジェクトを使用します。HTTPセッション・オブジェクトは、javax.servlet.http.HttpSessionインタフェースを実装するOC4Jによって提供されるクラスのインスタンスです。HttpSessionインタフェースは、次のパブリック・メソッドを指定して、セッション属性を処理します。

サーブレット・コンテナとサーブレット自体の構成に基づいて、セッションを設定時間後自動的に期限切れにできます。または、サーブレットで明示的に無効化できます。サーブレットでは、次のメソッドを使用してセッションのライフ・サイクルを管理できます。メソッドはHttpSessionインタフェースで指定します。

サーブレット・コンテキストを取得するユーティリティ・メソッドや、セッションの作成やアクセスに関する情報を取得するユーティリティ・メソッドもあります。

HttpSessionメソッドの詳細は、次のサイトでSun社のjavax.servlet.httpパッケージのJavadocを参照してください。

http://java.sun.com/j2ee/1.4/docs/api/index.html

セッション属性の追加および取得

次に、セッション属性を作成および表示するためのいくつかの一般的な手順を示します。 これらの手順の例の全体は、「セッション・オブジェクトの例」に示されています。

  1. リクエストからセッション・オブジェクトを取得します。

    HttpSession session = request.getSession();
    
  2. ユーザー入力を取得して、各属性の名前と値を指定します。この例では、サーブレットが、属性の名前と値を取得するフォームを持ち、それらをdatanameおよびdatavalueと呼ばれるリクエスト・パラメータに格納するものとします。(フォームは、例の全体が示されている項を参照してください。)

    String dataName = request.getParameter("dataname");
    String dataValue = request.getParameter("datavalue");
    
  3. 指定された名前と値を使用して各属性を設定します。

    if (dataName != null && dataValue != null) {
        session.setAttribute(dataName, dataValue);
    }
    
  4. すべての属性の出力をブラウザに戻す場合は、最初にgetAttributeNames()をコールしてすべての名前を取得してください。

    Enumeration attributeNames = session.getAttributeNames();
    
  5. java.util.Enumerationオブジェクトによる反復によってそれぞれの名前を取得し、対応する各値を取得して、名前と値を出力します。この例では、すべての名前と値をJava文字列として処理できるものとします。

    while (attributeNames.hasMoreElements()) {
       String name = attributeNames.nextElement().toString();
       String value = session.getAttribute(name).toString();
       out.println(name + " = " + value + "<br>");
    }
    


    重要

    クラスタリングされたアプリケーションでは、セッション属性として使用されるすべてのオブジェクトがjava.io.Serializableインタフェースを実装する必要があります。 



    注意

    HttpSessionインタフェースでは、メソッドのsetAttribute()getAttributeNames()およびgetAttribute()が、使用されなくなったputValue()getValueNames()およびgetValue()のかわりに使用されるようになりました。 


セッション・オブジェクトの例

この例は、「セッション属性の追加および取得」の手順をまとめたものです。この例には、属性の名前および値のユーザー入力を取得するフォームのコードと、セッションID、作成された時間、および最後にアクセスした時間(この場合は最後に属性が追加された時間)を表示するコードも含まれています。

前の例のように、POSTリクエストについては、doGet()メソッドがdoPost()メソッドによってコールされます。

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class SessionExample extends HttpServlet {
    
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {
        response.setContentType("text/html");
 
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<body bgcolor=\"white\">");
 
        out.println("<h3>" + "My Session Example" + "</h3>");
 
/* Display session ID, creation time, and access time. */
 
        HttpSession session = request.getSession();
        out.println("Session ID: " + session.getId());
        out.println("<br>");
        out.println("Created: ");
        out.println(new Date(session.getCreationTime()) + "<br>");
        out.println("Last accessed: ");
        out.println(new Date(session.getLastAccessedTime()));
 
/* Set attribute, based on data from user (form is later in code). */
 
        String dataName = request.getParameter("dataname");
        String dataValue = request.getParameter("datavalue");
        if (dataName != null && dataValue != null) {
            session.setAttribute(dataName, dataValue);
        }
 
/* Display all attributes. */
 
        out.println("<P>");
        out.println("The following data is in the session: <br>");
        Enumeration attributeNames = session.getAttributeNames();
        while (attributeNames.hasMoreElements()) {
           String name = attributeNames.nextElement().toString();
           String value = session.getAttribute(name).toString();
           out.println(name + " = " + value + "<br>");
        }
 
/* Take user input for an attribute. */
 
        out.println("<P>");
        out.print("<form action=\"");
        out.print("SessionExample\" ");
        out.println("method=POST>");
        out.println("Specify attribute name: ");
        out.println("<input type=text size=20 name=dataname>");
        out.println("<br>");
        out.println("Specify attribute value: ");
        out.println("<input type=text size=20 name=datavalue>");
        out.println("<br><br>");
        out.println("<input type=submit>");
        out.println("</form>");
 
        out.println("</body>");
        out.println("</html>");
        
    }
 
    public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {
        doGet(request, response);
    }
 
}

サーブレットを初めて実行すると、次のような画面が表示されます。


画像の説明

新しい属性の名前と値を入力して「Submit Query」をクリックするたびに、出力が更新され、新しい名前/値ペアが示されます。1つの属性の名前と値として「Customer」と「Brian」を入力し、別の属性の名前と値として「SSN」と「123-45-6789」を入力して、ペアを入力するたびに「Submit Query」をクリックする場合、出力は、次のように更新されます。セッション・オブジェクトの最後のアクセス時間も変更されていることに注意してください。


画像の説明

サーブレットでのCookieの使用方法

永続データの量が少ないときは、Cookieが有効になっていれば、独自のCookieを作成して使用することができます。Cookieは、javax.servlet.http.Cookieクラスのインスタンスによって表され、HTTPのリクエスト・ヘッダーおよびレスポンス・ヘッダーの属性としてクライアントとサーバーの間で受け渡されます。

サーブレットは、Cookieによって次のことを実行できます。

次の項では、Cookieの使用方法の詳細と例の全体を提供します。

Cookieの構成

デフォルトでは、Cookieは有効です。 ただし、「セッション・トラッキングの構成とOC4JでのCookieの有効化または無効化」で説明するように、global-web-application.xmlまたはorion-web.xmlファイルの<session-tracking>要素で、cookies="enabled"またはcookies="disabled"を設定することにより、Cookieを明示的に有効または無効にできます。

<session-tracking>要素には、次の追加のCookie設定もあります。

「<session-tracking>」も参照してください。


注意

Application Server Controlデプロイ・プラン・エディタのsessionTrackingプロパティの属性によって、Cookieを構成できます。詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。 


Cookieメソッドのサマリー

新しいCookieを作成するには、Cookieコンストラクタを使用します。

Cookieに関する情報を指定または取得するには、次のようなCookieのgetterおよびsetterメソッドを使用します。

Cookieメソッドの詳細は、次のサイトでSun社のjavax.servlet.httpパッケージのJavadocを参照してください。

http://java.sun.com/j2ee/1.4/docs/api/index.html

Cookieの取得、表示および追加

次に、Cookieを作成および表示するためのいくつかの一般的な手順を示します。 これらの手順の例の全体は、「Cookieの例」に示されています。

  1. リクエストの現在のCookieセットを含む一連のjavax.servlet.http.Cookieオブジェクトを取得するために、リクエスト・オブジェクトのgetCookies()メソッドをコールします。

    Cookie[] cookies = request.getCookies();
    
  2. Cookieの名前と値を出力するために、一連のオブジェクトを反復します(一連のオブジェクトが空の場合はユーザーに通知します)。

    if (cookies != null && cookies.length > 0) {
       for (int i = 0; i < cookies.length; i++) {
          Cookie cookie = cookies[i];
          out.print("Cookie name: " + cookie.getName() + "<br>");
          out.println("Cookie value: " + cookie.getValue() + "<br><br>");
       }
    } else {
       out.println("There are no cookies.");
    }
    
  3. 新しいCookieを作成するために、ユーザー入力を取得して名前と値を指定することができます。この例では、サーブレットが、名前と値を取得するフォームを持ち、それらをcookienameおよびcookievalueと呼ばれるリクエスト・パラメータに格納するものとします。(フォームは、例の全体が示されている項を参照してください。)

    String cookieName = request.getParameter("cookiename");
    String cookieValue = request.getParameter("cookievalue");
    
  4. 新しいCookieをレスポンスに追加するために、まず、指定された名前と値をCookieコンストラクタに入力してCookieを作成し、レスポンス・オブジェクトのaddCookie()メソッドをコールします。

    if (cookieName != null && cookieValue != null) {
       Cookie cookie = new Cookie(cookieName, cookieValue);
       response.addCookie(cookie);
    }
    

Cookieの例

この例は、「Cookieの取得、表示および追加」の手順をまとめたものです。この例には、Cookieの名前と値のユーザー入力を取得するフォームのコードも含まれています。

前の例のように、POSTリクエストについては、doGet()メソッドがdoPost()メソッドによってコールされます。

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class CookieExample extends HttpServlet {
    
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {
        response.setContentType("text/html");
 
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<body bgcolor=\"white\">");
 
        out.println("<h3>" + "My Cookies Example" + "</h3>");
 
/* Show cookies currently in request. */
 
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            out.println("Your browser is sending the following cookies:<br><br>");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                out.print("Cookie name: " + cookie.getName() + "<br>");
                out.println("Cookie value: " + cookie.getValue() + "<br><br>");
            }
        } else {
            out.println("There are no cookies.");
        }
 
/* Add new cookie that was just specified by user (form code below), and output
   back to the browser to confirm what the user just added.                  */

        String cookieName = request.getParameter("cookiename");
        String cookieValue = request.getParameter("cookievalue");
        if (cookieName != null && cookieValue != null) {
            Cookie cookie = new Cookie(cookieName, cookieValue);
            response.addCookie(cookie);
            out.println("<P>");
            out.println
      ("You just created the following cookie for your browser to send:<br><br>");
            out.print("New cookie name: " + cookieName + "<br>");
            out.print("New cookie value: " + cookieValue + "<br>");
        }

/* Form to prompt user for a cookie name and value. */

        out.println("<P>");
        out.println("Create a new cookie for your browser to send:<br>");
        out.print("<form action=\"");
        out.println("CookieExample\" method=POST>");
        out.print("Specify cookie name: ");
        out.println("<input type=text length=20 name=cookiename><br>");
        out.print("Specify cookie value: ");
        out.println("<input type=text length=20 name=cookievalue><br><br>");
        out.println("<input type=submit></form>");

        out.println("</body>");
        out.println("</html>");
    }
 
    public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {
        doGet(request, response);
    }

}

サーブレットを初めて実行すると、リクエストにすでに存在するすべてのCookieの名前と値が出力され、新しいCookieの追加を求められます。次の出力例では、すでに1つのCookieが存在します。


画像の説明

Cookieの名前と値を指定して「Submit Query」をクリックすると、サーブレットは入力内容を確認します。


画像の説明

サーブレットをリロードすると、リクエストに現在含まれているCookieのリストに新しいCookieが追加されたことを確認できます。


画像の説明

セッションのキャンセル

HTTPセッション・オブジェクトは、一般に、サーバー・サイド・セッションが存続する間、継続します。ただし、サーブレットによってセッションを明示的に終了することや、サーブレット・コンテナによって一定の存続期間後にセッションをキャンセルすることができます。

タイムアウトによるセッションのキャンセル

OC4Jサーバーのデフォルトのセッション・タイムアウトは、20分です。web.xml<session-config>要素の<session-timeout>サブ要素を設定することにより、特定のアプリケーション用にデフォルトを変更することができます。タイムアウトを分単位で、整数で指定します。たとえば、セッションのタイムアウトを5分に短縮するには、アプリケーションのweb.xmlファイルに次の行を追加します。

<session-config>
  <session-timeout>5</session-timeout>
</session-config>

サーブレット仕様では、負の値によって、セッションがタイムアウトにならないデフォルトの動作が指定されます。 次に例を示します。

<session-config>
  <session-timeout>-1</session-timeout>
</session-config>

値が0の場合は即時タイムアウトします。

特定のサーブレット用にOC4Jのタイムアウトまたは<session-timeout>設定をオーバーライドするために、セッション・オブジェクトのsetMaxInactiveInterval()メソッドを使用できます。このメソッドは、HttpSessionインタフェースで指定されます。整数値を指定しますが、このメソッドでは、タイムアウト値が分単位ではなく秒単位で指定することに注意してください。繰り返しますが、負の値の場合はタイムアウトになりません。

次の例は、10分のタイムアウトを指定します。

HttpSession session = request.getSession();
...
session.setMaxInactiveInterval(600);

getMaxInactiveInterval()メソッドは、タイムアウト時間(秒単位)を示す整数を返します。これは、setMaxInactiveInterval()で設定される値です(設定されている場合)。設定されていない場合は、<session-timeout>で指定されている値(秒単位に変換したもの)です(指定されている場合)。setMaxInactiveInterval()<session-timeout>も使用されていない場合、getMaxInactiveInterval()は、OC4Jのデフォルト・タイムアウト値(秒単位)の1200を返します。

セッションの明示的なキャンセル

サーブレットは、次の例のように、セッション・オブジェクト上でinvalidate()メソッドを起動することで、明示的にセッションをキャンセルできます。

HttpSession session = request.getSession();
...
session.invalidate();

これにより、セッションは即時に無効化され、セッションにバインドされているすべてのオブジェクトのバインディングが解除されます。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引