セッション管理についてServlet2.4などに規定されている仕様や、クライアント(ブラウザ)側の動作などの一般的な動作の仕組みについて説明します。
セッションの管理方法にはCookieを使用する方法とURLRewritingを使用する方法があります。Cookieを使用する方法では、セッションを識別するためのセッションIDをCookieに保存します。URLRewritingを使用する方法では、セッションIDをURLのパラメータに追加します。
次項で2つのセッション管理方法の動作イメージを示します。
コンテナはクライアントにクッキーを送信します。その後、クライアントは、それぞれのリクエストのときにセッションを含むクッキーつけて、サーバに送信します。セッションのクッキーの名前は”JSESSIONID”を使用します。
Cookieを使うセッションID管理方法は、セッションIDをWebブラウザのCookieに設定します。
ユーザアプリケーションはアクセス先URLを作成する際、URLにセッションIDを付加します。セッションIDは独自に編集するか、javax.servlet.http.HttpServletResponse#encodeURL()メソッドを用いて付加します。
URLRewritingを使うセッションID管理方法は、セッションIDをHTMLの<Form>タグのactionのURLなどに付加します。
セッションには有効期限が存在します。指定した期間クライアントからのリクエストが無い場合、Webコンテナはセッションを破棄します。以降破棄されたセッションに対しリクエストがあった場合、新たにセッションが作成され要求されたセッションと入れ替えられます。
WebOTXでのセッション管理に関連する基本的な設定について説明します。
セッションをCookieで管理するかURLRewritingで管理するか、Webアプリケーション単位で切り替えます。
運用管理コンソールによる設定
運用管理コンソール(http://<host>:5858/)を開きます。
ツリーより[アプリケーション]-[Webモジュール]-[<対象アプリケーション>]を選択してください。表示された設定画面の「セッションIDの管理」チェックボックスを設定してください。 チェックした場合はCookie管理、チェックしない場合はURLRewriting管理となります。
nec-web.xmlによる設定
| 説明 | ||
|---|---|---|
| セッションの管理方法を指定、trueを設定した場合はCookie管理、falseを設定した場合はURLRewriting管理となります。 |
||
| 設定詳細 | ||
| 設定箇所 | <コンテキストルート>/WEB-INF/nec-web.xml | |
| 既定値 | true | |
| 設定例 |
<nec-web-app>
:
<session-config>
<session-properties>
<property name="enableCookies" value="true" />
</session-properties>
:
|
|
| 備考 | nec-web.xmlは予めwarアーカイブに格納しておいてください。 | |
セッションのタイムアウト時間(有効期限)を設定します。設定には幾つかの種類がありそれぞれ有効範囲が異なります。それぞれの設定について説明します。優先順位は後者ほど高くなります。
domain全体に対する設定になります。
| 説明 | |||
|---|---|---|---|
| domain全体に対するセッションタイムアウト値を設定します。 | |||
| 設定詳細 | |||
| 設定箇所 | <domainディレクトリ>/config/default-web.xml | ||
| 既定値 | 30(分) | ||
| 最小値 | 1(分) ※0以下の場合セッションタイムアウトは行われません。 | ||
| 最大値 | 35791(分) | ||
| 設定例 |
<web-app>
:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
:
|
||
| 備考 | 設定変更後はドメインを再起動してください。 | ||
Webアプリケーション毎に有効な設定ですが、web.xmlの設定が無い場合に有効です。
| 説明 | ||
|---|---|---|
| Webアプリケーション毎に有効なセッションタイムアウト値を設定します。 |
||
| 設定詳細 | ||
| 設定箇所 | <コンテキストルート>/WEB-INF/nec-web.xml | |
| 既定値 | なし | |
| 最小値 | 1(秒) ※0以下の場合セッションタイムアウトは行われません。 | |
| 最大値 | 2147483(秒) | |
| 設定例 |
<nec-web-app>
:
<session-config>
<session-properties>
<property name="timeoutSeconds" value="5"/>
</session-properties>
</session-config>
:
|
|
| 備考 | nec-web.xmlは予めwarアーカイブに格納しておいてください。 | |
Webアプリケーション毎に有効な設定になります。
| 説明 | ||
|---|---|---|
| Webアプリケーション毎に有効なセッションタイムアウト値を設定します。 |
||
| 設定詳細 | ||
| 設定箇所 | <コンテキストルート>/WEB-INF/web.xml | |
| 既定値 | なし | |
| 最小値 | 1 ※0以下の場合セッションタイムアウトは行われません。 | |
| 最大値 | 35791(分) | |
| 設定例 |
<web-app>
:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
:
|
|
| 備考 | ||
セッション毎に有効な設定でユーザがWebアプリケーション中で指定します。
| 説明 | ||
|---|---|---|
| セッション毎に有効なセッションタイムアウト値をjavax.servlet.http.HttpSession#setMaxInactiveInterval()メソッドで設定します。 |
||
| 設定詳細 | ||
| 設定箇所 | Webアプリケーションのロジック中 | |
| 既定値 | なし | |
| 最小値 | 1(秒) ※0以下の場合セッションタイムアウトは行われません。 | |
| 最大値 | 2147483(秒) | |
| 設定例 |
:
HttpSession session = request.getSession();
session.setMaxInactiveInterval(300);
:
|
|
| 備考 | ||
WebOTXでは何も設定しないデフォルトの状態ではdomainの停止と共にセッション情報は消えてしまいます。セッション情報をファイルに保存する設定を行うことでdomain再起動後もセッションをファイルから復元、継続して使用することができます。
※ セッション情報を保存したファイルの保存箇所は<domainディレクトリ>/generated/jsp/j2ee-modules/<Webアプリケーション名>配下がカレントになります。このディレクトリはWebアプリケーションを配備解除するとディレクトリが削除され、セッション情報が失われますのでご注意ください。
セッションはメモリ上に展開され、domainの停止時にファイルに出力されます。domainが正常に停止されない場合(突然のアボート等)、セッション情報はファイルに保存されないことがあります。
| 説明 | ||
|---|---|---|
| セッション情報の保存方法をメモリ管理に設定する |
||
| 設定詳細 | ||
| 設定箇所 | <コンテキストルート>/WEB-INF/nec-web.xml | |
| 既定値 | memory | |
| 設定例 |
<nec-web-app>
:
<session-config>
<session-manager persistence-ype="memory">
<manager-properties>
<property name="sessionFilename" value="/session.ser"/>
</manager-properties>
</session-manager>
</session-config>
:
|
|
| 備考 | nec-web.xmlは予めwarアーカイブに格納しておいてください。 | |
セッションはメモリ、ファイル両方に展開されます。メモリ上で管理されているセッション情報を一定間隔(60秒)でファイルに出力します。セッション更新後ファイル出力をまたずdomainが正常に停止されない場合(突然のアボート等)、ファイルに最新情報が反映されない場合があります。
| 説明 | ||
|---|---|---|
| セッション情報の保存方法をファイル管理に設定する |
||
| 設定詳細 | ||
| 設定箇所 | <コンテキストルート>/WEB-INF/nec-web.xml | |
| 既定値 | memory | |
| 設定例 |
<nec-web-app>
:
<session-config>
<session-manager persistence-type="file">
<manager-properties>
<property name="sessionFilename" value="/session.ser"/>
</manager-properties>
</session-manager>
</session-config>
:
|
|
| 備考 | nec-web.xmlは予めwarアーカイブに格納しておいてください。 | |
同時に作成できるセッションの最大数を設定します。
セッションレプリケーション時に本項目を指定するとセッション数増加に伴いセッションを払いだす時間が長くなります。ご注意ください。
| 説明 | ||
|---|---|---|
| セッションの同時最大数を設定する |
||
| 設定詳細 | ||
| 設定箇所 | <コンテキストルート>/WEB-INF/nec-web.xml | |
| 既定値 | -1(制限なし) | |
| 最小値 | 1 | |
| 最大値 | 2147483647(個) | |
| 設定例 |
<nec-web-app>
:
<session-config>
<session-manager>
<manager-properties>
<property name="maxSessions" value="200"/>
</manager-properties>
</session-manager>
</session-config>
:
|
|
| 備考 | ||
セッションをCookie管理している場合、セッションIDを格納するCookieをはじめユーザが作成したCookieにも自動でセキュアオプションの設定を行うことができます。セキュアオプションを設定したCookieはクライアントからHTTPSプロトコルでアクセスされた場合のみリクエストに付加され、HTTPプロトコルでアクセスされた場合は付加されなくなります。
| 説明 | ||
|---|---|---|
| セッションのセキュアオプションを強制設定する |
||
| 設定詳細 | ||
| 設定箇所 | <コンテキストルート>/WEB-INF/nec-web.xml | |
| 既定値 | false | |
| 設定例 |
<nec-web-app>
:
<session-config>
<property name="alwayCookieSecure" value="true"/>
</session-config>
:
|
|
| 備考 | ||
HttpServletResponse.encodeURL()を実行しても、URLRewriting(セッションIDの付加)を行わない設定を行います。
| 説明 | ||
|---|---|---|
| URLRewriting(セッションIDの付加)を行わない設定 |
||
| 設定詳細 | ||
| 設定箇所 | <コンテキストルート>/WEB-INF/nec-web.xml | |
| 既定値 | true | |
| 設定例 |
<nec-web-app>
:
<session-config>
<session-properties>
<property name="enableURLRewriting" value="false" />
:
|
|
| 備考 | ||
セッションを強制的に使えなくする設定です。動作的にはセッションオブジェクトが取得できないわけではなく、リクエストの終了時セッションがあれば無効化するような動作になります。 また、レスポンス(CookieやURLRewriting)にセッションIDは設定されません。
| 説明 | ||
|---|---|---|
| セッションを使えなくする設定 |
||
| 設定詳細 | ||
| 設定箇所 | <コンテキストルート>/WEB-INF/nec-web.xml | |
| 既定値 | true | |
| 設定例 |
<nec-web-app>
:
<<session-config>
<session-properties>
<property name="enableSession" value="false" />
:
|
|
| 備考 | ||
ドメインもしくはプロセスグループ単位でセッションIDに、指定した文字列を付加することができます。セッションIDを払い出したWebサーバを特定したい場合などに使用します。
| 説明 | ||
|---|---|---|
| セッションIDに指定文字列を付加する設定。セッションIDに"."を区切り文字として指定文字列を付加します。 |
||
| 設定詳細 | ||
| 設定箇所 | JVMオプション | |
| 既定値 | なし | |
| 設定例 |
-DjvmRoute="hoho1"otxadminコマンドを用いて設定する場合
|
|
| 備考 |
プロセスIDとJvmRouteを付加した場合のセッションIDの例を示します。 5B22AF53A66CAB1AB26490EB430D36C3.hoho1$3936 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ ~~~~ セッションID(32桁) . JvmRoute $ プロセスID |
|
システムの信頼性を高めるための複数のサーバ間でセッションデータを複製しておく仕組みをセッションレプリケーションと言います。セッションレプリケーションを設定することで1台のサーバがダウンした場合でも複製したセッション情報を元に他のサーバが処理を引き継ぐことができます。WebOTXのセッションレプリケーションはセッション情報をJNDIに格納し、そのJNDIを2重化することで実現します。
セッションレプリケーションを行うにあたり、Webアプリケーションの作りに一部制限が存在します。詳細は「5.5.3.2.3.Webアプリケーション実装の注意/制限事項」を参照してください。
セッションレプリケーションの概要を図にします。
WebOTXのレプリケーション機能の動作概要について記述します。
セッションレプリケーションに関する設定と、Webアプリケーション実装上の注意/制限事項を記述します。
※セッションレプリケーションを設定する場合、セッションの管理方法をメモリに設定する必要があります。「5.5.2.3.1.メモリ管理によるセッション保存」参照
Webアプリケーションにセッション情報をJNDIに登録するための設定を行います。
| 説明 | ||
|---|---|---|
| Webアプリケーションにセッションレプリケーションの設定を行います。ON/OFFは要素を記述するかしないかになります。 またdefault-web.xmlに本項目を設定すると、セッションレプリケーションに対応していないWebアプリケーションにも影響を与えてしまいますので、Webアプリケーション毎にweb.xmlに設定してください。 | ||
| 設定詳細 | ||
| 設定箇所 | <コンテキストルート>/WEB-INF/web.xml | |
| 既定値 | なし(OFF) | |
| 設定例 |
<web-app>
:
<distributable/>
:
|
|
| 備考 | ||
異なるdomainのJNDIを連携設定することでセッション情報を共有します。設定方法によらず設定内容はセッションレプリケーションするJNDIサーバのURLを"rmiiiop://host1:port,host2:port"の形式で設定します。ここで2重化されるのはセッション情報のみです。
画面左ツリーより「Webアプリケーションサーバ」-「Webコンテナ」を選択し、「JNDI Servlet URL」を更新します。
運用管理コマンドより以下のコマンドを実行します。
| otxadmin> set server.web-container.session-replication-jndi-url=rmiiiop://host:port,host2:port |
WebOTXのセッションレプリケーションを使用するにあたり、Webアプリケーションの実装注意点があります。
どのような場合に問題になるか例を記述します
<ソースコード>
|
|
レプリケーション前と同じ取得を"DEF"にしたい場合はiiとiiiの間で再度setAttribute()を実行する必要があります。
|
セッションレプリケーションを設定するとセッション情報がJNDIに格納されるようになります。この際セッションに格納しているオブジェクトに関して注意点があります。
セッション情報として、VectorやHashtableなど、同期化されたコレクションクラスを使用すると、シリアライズ/デシリアライズが同期化されてしまいます。同期化されてしまうと処理が直列化されて、大幅な性能低下につながるおそれがあります。そのためVectorやHashtableではなく同期化されないArrayListやHashMapをご使用ください。
また、シリアライズ/デシリアライズは複雑なコレクションクラスの処理には時間が掛かります。セッション情報として使用するオブジェクトはシンプルなものをお勧めします。