Oracle Containers for J2EE サーブレット開発者ガイド 10g(10.1.3.1.0) B31859-01 |
|
複数のリクエストおよびレスポンスについてユーザーの状態情報の追跡に使用されるサーブレット・セッションの概要は、「サーブレット・セッション(ユーザー・セッション)の使用目的」で示しました。次の項では、セッション属性およびCookieの使用を含む詳細と例を提供します。
OC4Jのサーブレット・コンテナは、サーブレット仕様に従い、HTTPセッション・オブジェクト(javax.servlet.http.HttpSession
インタフェースを実装するクラスのインスタンス)によってセッション・トラッキングを実装します。(このクラスはOC4Jサーブレット・コンテナによって提供されます。)サーブレットでHTTPセッション・オブジェクトを作成する場合、クライアントの相互作用はステートフルであるとみなされます。
セッション・オブジェクトは、値(Javaオブジェクト)を関連付けられたキー(Java文字列)とともに格納したり、名前(Java文字列)を格納したりするディクショナリと考えることができます。それぞれの名前/値ペアは、セッション属性を構成します。
次の項では、セッション・オブジェクトおよびその他のセッション・トラッキング機能について説明します。
サーブレットは、HTTPリクエスト・オブジェクトのgetSession()
メソッドを使用して、HTTPセッション・オブジェクトを取得または作成します。 このメソッドは、ブール引数を取得して、オブジェクト・セッションがアプリケーション内に存在しない場合に、クライアントに対して新規セッション・オブジェクトを作成する必要があるかどうかを指定します。セッション・オブジェクトの属性を使用すると、setAttribute()
およびgetAttribute()
メソッドにより、ユーザー・セッションに関連するデータを格納および取得できます。 「サーブレットでのセッション・オブジェクトの使用方法」を参照してください。
セッション・オブジェクトを使用して、アプリケーション間でデータを共有したり、同一アプリケーションの異なるクライアント間でデータを共有したりすることはできません。1つのアプリケーションの1つのクライアント当たり1つのHTTPセッション・オブジェクトが存在します。
特定のセッションと適切なセッション・オブジェクトとのマッピングを維持して、現在のセッションの情報に適切にアクセスできるようにするために、OC4Jは、セッションごとに一意のセッションIDを生成します。ステートフル・サーブレット(基本的に、セッション・オブジェクトを作成したサーブレット)がクライアントにレスポンスを返す際に、OC4Jによって生成されたセッションIDがレスポンスにインクルードされます。Cookieが有効な場合、OC4Jは、セッションID Cookieを使用してこれを実行します。 「OC4Jがセッション・トラッキングにCookieを使用する方法」を参照してください。
Cookieが無効な場合、セッションIDはURLリライティングによって通信され、HTTPレスポンス・オブジェクトのencodeURL()
メソッド(インクルードまたは転送の場合はencodeRedirectURL()
メソッド)をコールする必要があります。 「セッション・トラッキングのためのURLリライティングの使用」を参照してください。
セッション・データを永続データにする場合、保護、トランザクションの安全性、およびデータベースによるバックアップ機能が必要であれば、その永続データをデータベースに格納できます。データ量が少なく、データベース機能が不要なときは、独自のCookieを作成して使用するか、多くの場合、ファイル・システムまたはその他のリモート・オブジェクトを使用することができます。
Cookieは名前と単一の関連値を持ち、HTTPのリクエスト・ヘッダーおよびレスポンス・ヘッダーの属性として格納されます。 「サーブレットでのCookieの使用方法」を参照してください。
セッション・データは、一般に、セッション・オブジェクトの属性を使用して格納および操作されますが、データ量が少ない場合、特に永続データにしようとしている情報については、Cookieを作成して使用することもできます。セッション属性のかわりにCookieを使用するかどうかは好みや意図の問題ですが、次の点を考慮してください。
たとえば、業務関連のデータにセッション属性を使用し、プレゼンテーション関連のデータにCookieを使用するという方針を立てることができます。Cookieは、表示内容や表示方法をサーブレットに通知し同じユーザーの後続のセッション間で変更されにくい情報(ユーザーに関する情報など)を示すことができます。
次の項では、セッション・トラッキングのためのOC4Jの主な機能について説明します。
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>
また、<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>」も参照してください。
Cookieが有効な場合、OC4Jは、次のように、セッション・トラッキングCookieを使用します。
JSESSIONID
という名前のCookieをHTTP Set-Cookie
レスポンス・ヘッダーで送信します。
このCookieを送信するためのサーブレット・コードは不要です。送信はコンテナで自動的に処理されます。Cookieのサーバーへの返信は、Webブラウザで自動的に処理されます。
「保護された接続によるセッション・トラッキング」も参照してください。
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()
メソッドのコールによってアクションは実行されません。
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リライティングを使用する状態に戻ります。
スタンドアロン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メソッドによるセッション属性の作成および取得について説明し、最後に例を示します。
サーブレット・コンテナはユーザー・セッションのデータの管理に、HTTPセッション・オブジェクトを使用します。HTTPセッション・オブジェクトは、javax.servlet.http.HttpSession
インタフェースを実装するOC4Jによって提供されるクラスのインスタンスです。HttpSession
インタフェースは、次のパブリック・メソッドを指定して、セッション属性を処理します。
void setAttribute(String name, Object value)
指定したオブジェクトを指定した名前でセッション・オブジェクトに追加して、セッション属性を追加します。
Enumeration getAttributeNames()
すべてのセッション属性の名前について、String
オブジェクトで構成されるjava.util.Enumeration
オブジェクトを取得します。
Object getAttribute(String name)
指定した名前を持つセッション属性の値を取得します(名前が一致しない場合はnull
を返します)。
void removeAttribute(String name)
指定した名前を持つセッション属性を削除します。
サーブレット・コンテナとサーブレット自体の構成に基づいて、セッションを設定時間後自動的に期限切れにできます。または、サーブレットで明示的に無効化できます。サーブレットでは、次のメソッドを使用してセッションのライフ・サイクルを管理できます。メソッドはHttpSession
インタフェースで指定します。
セッションのタイムアウト時間(秒単位)をint型で設定します。サーブレット・コンテナのデフォルトやweb.xml
の<session-timeout>
要素によって設定されたデフォルトはオーバーライドされます。負の値は、タイムアウトしないことを示します。値が0の場合は即時タイムアウトします。 「セッションのキャンセル」も参照してください。
int getMaxInactiveInterval()
セッションのタイムアウト時間(秒単位)を示す値を取得します。setMaxInactiveInterval()
によってタイムアウト値を指定している場合は、その値が返されます。それ以外の場合は、web.xml
の<session-timeout>
要素の値が返されます(指定されている場合)。この値も指定されていない場合は、サーブレット・コンテナのデフォルトのタイムアウトが返されます。
void invalidate()
セッションを即時に無効化し、すべてのオブジェクトのバインディングをセッションから解除します。
サーブレット・コンテキストを取得するユーティリティ・メソッドや、セッションの作成やアクセスに関する情報を取得するユーティリティ・メソッドもあります。
ServletContext getServletContext()
セッションが属するサーブレット・コンテキストを取得します。
boolean isNew()
セッションを作成したリクエスト内にある場合はtrue
を戻します。それ以外の場合はfalse
を戻します。
long getCreationTime()
セッション・オブジェクトの作成時間を、1970年1月1日午前0時を基点としたミリ秒単位で戻します。
long getLastAccessedTime()
クライアント・セッションに関連付けられた最新のリクエストの時間を、1970年1月1日午前0時を基点としたミリ秒単位で戻します。クライアント・セッションがアクセスされていない場合、このメソッドはセッションが作成された時間を返します。
HttpSession
メソッドの詳細は、次のサイトでSun社のjavax.servlet.http
パッケージのJavadocを参照してください。
http://java.sun.com/j2ee/1.4/docs/api/index.html
次に、セッション属性を作成および表示するためのいくつかの一般的な手順を示します。 これらの手順の例の全体は、「セッション・オブジェクトの例」に示されています。
HttpSession session = request.getSession();
dataname
およびdatavalue
と呼ばれるリクエスト・パラメータに格納するものとします。(フォームは、例の全体が示されている項を参照してください。)
String dataName = request.getParameter("dataname"); String dataValue = request.getParameter("datavalue");
if (dataName != null && dataValue != null) { session.setAttribute(dataName, dataValue); }
getAttributeNames()
をコールしてすべての名前を取得してください。
Enumeration attributeNames = session.getAttributeNames();
java.util.Enumeration
オブジェクトによる反復によってそれぞれの名前を取得し、対応する各値を取得して、名前と値を出力します。この例では、すべての名前と値をJava文字列として処理できるものとします。
while (attributeNames.hasMoreElements()) { String name = attributeNames.nextElement().toString(); String value = session.getAttribute(name).toString(); out.println(name + " = " + value + "<br>"); }
この例は、「セッション属性の追加および取得」の手順をまとめたものです。この例には、属性の名前および値のユーザー入力を取得するフォームのコードと、セッション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は、javax.servlet.http.Cookie
クラスのインスタンスによって表され、HTTPのリクエスト・ヘッダーおよびレスポンス・ヘッダーの属性としてクライアントとサーバーの間で受け渡されます。
サーブレットは、Cookieによって次のことを実行できます。
Cookie
クラス・コンストラクタを使用して、指定された名前および値でCookieを作成する。
addCookie()
メソッドを使用して、Cookieをレスポンスに追加する。
getCookies()
メソッドを使用して、リクエストからCookieを取得する。
Cookie
クラスのメソッド(この少し後にサマリーがあります)を使用して、Cookieの名前の取得や、Cookieの値やその他の情報を取得または設定する。
次の項では、Cookieの使用方法の詳細と例の全体を提供します。
Cookieが有効になっている場合、OC4Jは、自動的にCookieを使用して、セッションIDを追跡し続けます。詳細は、「OC4Jがセッション・トラッキングにCookieを使用する方法」を参照してください。
注意
デフォルトでは、Cookieは有効です。 ただし、「セッション・トラッキングの構成とOC4JでのCookieの有効化または無効化」で説明するように、global-web-application.xml
またはorion-web.xml
ファイルの<session-tracking>
要素で、cookies="enabled"
またはcookies="disabled"
を設定することにより、Cookieを明示的に有効または無効にできます。
<session-tracking>
要素には、次の追加のCookie設定もあります。
cookie-domain
: Cookieに必要なドメインです。一般に、これを使用して、複数のWebサイト上で単一クライアントまたはユーザーを追跡します。設定はピリオド(.)から始まる必要があります。 次に例を示します。
<session-tracking cookie-domain=".us.oracle.com" />
この場合、ユーザーが.us.oracle.com
ドメイン・パターンに一致する任意のサイト(webserv1.us.oracle.com
またはwebserv2.us.oracle.com
など)にアクセスすると、同じCookieが使用および再使用されます。
ドメイン仕様は少なくとも2つの部分(.us.oracle.com
または.oracle.com
など)で構成する必要があります。たとえば、.com
という設定は無効です。
Cookieドメイン機能を使用すると、たとえば、異なるホスト上で実行されているWebアプリケーションのノード間において、セッションの状態を共有できます。
特定のCookieについては、そのCookieのsetDomain()
メソッドを使用してcookie-domain
設定をオーバーライドできます。
cookie-max-age
: この数値は、セッションCookieとともに送信され、ブラウザがCookieを保存する最大期間(秒単位)を指定します。デフォルトでは、ブラウザ・セッションの間Cookieはメモリーに格納され、その後廃棄されます。このため永続性はありません。特定のCookieについては、そのCookieのsetMaxAge()
メソッドを使用してcookie-max-age
設定をオーバーライドできます。 追加情報は、次項の「Cookieメソッドのサマリー」を参照してください。
「<session-tracking>」も参照してください。
新しいCookieを作成するには、Cookie
コンストラクタを使用します。
Cookieに関する情報を指定または取得するには、次のようなCookie
のgetterおよびsetterメソッドを使用します。
String getName()
Cookieの名前を返します。
void setValue(String value)
Cookieの新しい値をJava文字列として指定します。
String getValue()
Cookieの現在の値をJava文字列として返します。
void setDomain(String value)
デフォルトでは、Cookieは送信元のサーバーにしか返されませんが、このメソッドを使用すると、Cookieが表示されるドメインまたはドメイン・ネーム・システム・ゾーンを指定できます。 OC4JでのCookieドメインの使用については、「Cookieの構成」を参照してください。
String getDomain()
Cookieが表示されるドメインを返します。
void setMaxAge(int maxAge)
Cookieが期限切れになるまでの最大期間(秒単位)を指定します。値を0にすると、Cookieはすぐに削除されます。値を-1にすると、Cookieはブラウザがシャットダウンされるまで存在します。このため、永続的に格納されることはありません。デフォルトは、-1またはOC4J構成で指定された値です。 「Cookieの構成」を参照してください。
int getMaxAge()
Cookieが期限切れになるまでの最大期間(秒単位)または特別な値(setMaxAge()
に関する説明を参照)を返します。
void setComment(String comment)
Cookieに関する情報を提供するコメントを作成します。
String getComment()
Cookieに関する情報を提供するコメント(コメントがない場合はnull
)を返します。
Cookie
メソッドの詳細は、次のサイトでSun社のjavax.servlet.http
パッケージのJavadocを参照してください。
http://java.sun.com/j2ee/1.4/docs/api/index.html
次に、Cookieを作成および表示するためのいくつかの一般的な手順を示します。 これらの手順の例の全体は、「Cookieの例」に示されています。
javax.servlet.http.Cookie
オブジェクトを取得するために、リクエスト・オブジェクトのgetCookies()
メソッドをコールします。
Cookie[] cookies = request.getCookies();
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."); }
cookiename
およびcookievalue
と呼ばれるリクエスト・パラメータに格納するものとします。(フォームは、例の全体が示されている項を参照してください。)
String cookieName = request.getParameter("cookiename"); String cookieValue = request.getParameter("cookievalue");
Cookie
コンストラクタに入力してCookieを作成し、レスポンス・オブジェクトのaddCookie()
メソッドをコールします。
if (cookieName != null && cookieValue != null) { Cookie cookie = new Cookie(cookieName, cookieValue); response.addCookie(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();
これにより、セッションは即時に無効化され、セッションにバインドされているすべてのオブジェクトのバインディングが解除されます。
|
Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|