5.5.HTTPセッション管理

5.5.1.HTTPセッション管理について

セッション管理についてServlet2.4などに規定されている仕様や、クライアント(ブラウザ)側の動作などの一般的な動作の仕組みについて説明します。

セッションの管理方法にはCookieを使用する方法とURLRewritingを使用する方法があります。Cookieを使用する方法では、セッションを識別するためのセッションIDをCookieに保存します。URLRewritingを使用する方法では、セッションIDをURLのパラメータに追加します。

次項で2つのセッション管理方法の動作イメージを示します。

5.5.1.1.Cookieによるセッション管理

コンテナはクライアントにクッキーを送信します。その後、クライアントは、それぞれのリクエストのときにセッションを含むクッキーつけて、サーバに送信します。セッションのクッキーの名前は”JSESSIONID”を使用します。

Cookieによるセッション管理の図

Cookieを使うセッションID管理方法は、セッションIDをWebブラウザのCookieに設定します。

5.5.1.2.URLRewritingによるセッション管理

ユーザアプリケーションはアクセス先URLを作成する際、URLにセッションIDを付加します。セッションIDは独自に編集するか、javax.servlet.http.HttpServletResponse#encodeURL()メソッドを用いて付加します。

URLRewritingによるセッション管理の図

URLRewritingを使うセッションID管理方法は、セッションIDをHTMLの<Form>タグのactionのURLなどに付加します。

5.5.1.3.セッションタイムアウトについて

セッションには有効期限が存在します。指定した期間クライアントからのリクエストが無い場合、Webコンテナはセッションを破棄します。以降破棄されたセッションに対しリクエストがあった場合、新たにセッションが作成され要求されたセッションと入れ替えられます。


5.5.2.WebOTXの基本的な設定

WebOTXでのセッション管理に関連する基本的な設定について説明します。

5.5.2.1.セッション管理方法の切替

セッションをCookieで管理するかURLRewritingで管理するか、Webアプリケーション単位で切り替えます。


5.5.2.2.セッションのタイムアウト時間

セッションのタイムアウト時間(有効期限)を設定します。設定には幾つかの種類がありそれぞれ有効範囲が異なります。それぞれの設定について説明します。優先順位は後者ほど高くなります。

5.5.2.2.1.default-web.xmlによる設定

domain全体に対する設定になります。

説明
domain全体に対するセッションタイムアウト値を設定します。
 
設定詳細
設定箇所 <domainディレクトリ>/config/default-web.xml
既定値30(分)
最小値1(分) ※0以下の場合セッションタイムアウトは行われません。
最大値35791(分)
設定例
  <web-app>
        :
    <session-config>
      <session-timeout>30</session-timeout>
    </session-config>
        :
備考設定変更後はドメインを再起動してください。

5.5.2.2.2.nec-web.xmlによる設定

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アーカイブに格納しておいてください。

5.5.2.2.3.web.xmlによる設定

Webアプリケーション毎に有効な設定になります。

説明
Webアプリケーション毎に有効なセッションタイムアウト値を設定します。
 
設定詳細
設定箇所 <コンテキストルート>/WEB-INF/web.xml
既定値なし
最小値1 ※0以下の場合セッションタイムアウトは行われません。
最大値35791(分)
設定例
  <web-app>
      :
    <session-config>
      <session-timeout>30</session-timeout>
    </session-config>
      :
備考

5.5.2.2.4.Webアプリケーションによる設定

セッション毎に有効な設定でユーザがWebアプリケーション中で指定します。

説明
セッション毎に有効なセッションタイムアウト値をjavax.servlet.http.HttpSession#setMaxInactiveInterval()メソッドで設定します。
 
設定詳細
設定箇所 Webアプリケーションのロジック中
既定値なし
最小値1(秒) ※0以下の場合セッションタイムアウトは行われません。
最大値2147483(秒)
設定例
    :
  HttpSession session = request.getSession();
  session.setMaxInactiveInterval(300);
    :
備考

5.5.2.3.セッション情報の保存

WebOTXでは何も設定しないデフォルトの状態ではdomainの停止と共にセッション情報は消えてしまいます。セッション情報をファイルに保存する設定を行うことでdomain再起動後もセッションをファイルから復元、継続して使用することができます。

※ セッション情報を保存したファイルの保存箇所は<domainディレクトリ>/generated/jsp/j2ee-modules/<Webアプリケーション名>配下がカレントになります。このディレクトリはWebアプリケーションを配備解除するとディレクトリが削除され、セッション情報が失われますのでご注意ください。

5.5.2.3.1.メモリ管理によるセッション保存

セッションはメモリ上に展開され、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アーカイブに格納しておいてください。

5.5.2.3.2.ファイル管理によるセッション保存

セッションはメモリ、ファイル両方に展開されます。メモリ上で管理されているセッション情報を一定間隔(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アーカイブに格納しておいてください。

5.5.2.4.セッションの同時最大数設定

同時に作成できるセッションの最大数を設定します。

セッションレプリケーション時に本項目を指定するとセッション数増加に伴いセッションを払いだす時間が長くなります。ご注意ください。

説明
セッションの同時最大数を設定する
 
設定詳細
設定箇所 <コンテキストルート>/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>
      :
備考

5.5.2.5.セッションのセキュアオプションについての設定

セッションを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>
      :
備考

5.5.2.6.URLのセッションID付加抑制の設定

HttpServletResponse.encodeURL()を実行しても、URLRewriting(セッションIDの付加)を行わない設定を行います。

説明
URLRewriting(セッションIDの付加)を行わない設定
 
設定詳細
設定箇所 <コンテキストルート>/WEB-INF/nec-web.xml
既定値true
設定例
  <nec-web-app>
      :
    <session-config>
      <session-properties>
        <property name="enableURLRewriting" value="false" />
      :
備考

5.5.2.7.セッションを強制的に使えなくする設定

セッションを強制的に使えなくする設定です。動作的にはセッションオブジェクトが取得できないわけではなく、リクエストの終了時セッションがあれば無効化するような動作になります。 また、レスポンス(CookieやURLRewriting)にセッションIDは設定されません。

説明
セッションを使えなくする設定
 
設定詳細
設定箇所 <コンテキストルート>/WEB-INF/nec-web.xml
既定値true
設定例
  <nec-web-app>
      :
    <<session-config>
      <session-properties>
        <property name="enableSession" value="false" />
      :
備考

5.5.2.8.jvmRouteオプションの設定

ドメインもしくはプロセスグループ単位でセッションIDに、指定した文字列を付加することができます。セッションIDを払い出したWebサーバを特定したい場合などに使用します。

説明
セッションIDに指定文字列を付加する設定。セッションIDに"."を区切り文字として指定文字列を付加します。
 
設定詳細
設定箇所 JVMオプション
既定値なし
設定例
  -DjvmRoute="hoho1"
otxadminコマンドを用いて設定する場合
  • 設定例
    otxadmin> create-jvm-options -DjvmRoute=hoho1
備考

プロセスIDとJvmRouteを付加した場合のセッションIDの例を示します。

  5B22AF53A66CAB1AB26490EB430D36C3.hoho1$3936
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ ~~~~
  セッションID(32桁) . JvmRoute $ プロセスID



5.5.3.セッションレプリケーション

5.5.3.1.セッションレプリケーションについて

システムの信頼性を高めるための複数のサーバ間でセッションデータを複製しておく仕組みをセッションレプリケーションと言います。セッションレプリケーションを設定することで1台のサーバがダウンした場合でも複製したセッション情報を元に他のサーバが処理を引き継ぐことができます。WebOTXのセッションレプリケーションはセッション情報をJNDIに格納し、そのJNDIを2重化することで実現します。

セッションレプリケーションを行うにあたり、Webアプリケーションの作りに一部制限が存在します。詳細は「5.5.3.2.3.Webアプリケーション実装の注意/制限事項」を参照してください。

セッションレプリケーションの概要を図にします。

セッションレプリケーションの概要図



WebOTXのレプリケーション機能の動作概要について記述します。

  1. 共有されるセッション情報の範囲と共有のトリガ
    全てのセッション情報が共有され、セッションに格納している情報の更新があった場合、更新された差分のみが更新/共有されます。
    またHTTPリクエスト受信時、セッションが検出された場合、セッションへのアクセス時刻を更新/共有します。

  2. レプリケーション時の性能
    レプリケーションした環境では無負荷状態で、クライアントへのレスポンスは約10mSec遅くなります。 セッションへのアクセス回数やJNDIサーバに登録されているセッション数に依存して遅くなります。
    セッションの最大数は、デフォルトでは無制限ですが、この値を設定すると、新規セッション生成時にはセッション数をJNDIサーバから 情報を取り出して現状のセッション数を数えるため、レスポンスが遅くなります。

5.5.3.2.セッションレプリケーションの設定

セッションレプリケーションに関する設定と、Webアプリケーション実装上の注意/制限事項を記述します。

※セッションレプリケーションを設定する場合、セッションの管理方法をメモリに設定する必要があります。「5.5.2.3.1.メモリ管理によるセッション保存」参照

5.5.3.2.1.セッションレプリケーションの設定

Webアプリケーションにセッション情報をJNDIに登録するための設定を行います。

説明
Webアプリケーションにセッションレプリケーションの設定を行います。ON/OFFは要素を記述するかしないかになります。
またdefault-web.xmlに本項目を設定すると、セッションレプリケーションに対応していないWebアプリケーションにも影響を与えてしまいますので、Webアプリケーション毎にweb.xmlに設定してください。
 
設定詳細
設定箇所 <コンテキストルート>/WEB-INF/web.xml
既定値なし(OFF)
設定例
  <web-app>
      :
    <distributable/>
      :
備考
5.5.3.2.2.JNDIのレプリケーション設定

異なるdomainのJNDIを連携設定することでセッション情報を共有します。設定方法によらず設定内容はセッションレプリケーションするJNDIサーバのURLを"rmiiiop://host1:port,host2:port"の形式で設定します。ここで2重化されるのはセッション情報のみです。


5.5.3.2.3.Webアプリケーション実装の注意/制限事項

WebOTXのセッションレプリケーションを使用するにあたり、Webアプリケーションの実装注意点があります。

  1. レプリケーションした場合、セッションのAttributeに設定できるオブジェクトはシリアライズできるものに限られます。


  2. レプリケーションした場合、セッションのAttributeに設定したオブジェクトとJNDIで管理されているオブジェクトは別インスタンスの扱いになります。

    どのような場合に問題になるか例を記述します

    <ソースコード>
    1. HttpSession session = .getSessin();
      hohoClass clazz = new hohoClass();
      clazz.buff = "ABC";
      session.setAttribute("hoho", clazz);
    2. clazz.buff = "DEF";
    3. hohoClass clazz2 = (hohoClass)session.getAttribute("hoho");
      String buff = clazz2.buff;
    <ソースコード解説>
    1. あるクラスが持つStringオブジェクトに"ABC"を格納しセッションのAttributeに設定します。
    2. Stringオブジェクトの内容を"DEF"に更新します。
    3. セッションのAtrributeからクラスのStringオブジェクトを取得します。レプリケーション設定していない場合、取得したStringオブジェクトの内容は"DEF"ですが、レプリケーション設定した場合、内容は"ABC"になります。

    レプリケーション前と同じ取得を"DEF"にしたい場合はiiとiiiの間で再度setAttribute()を実行する必要があります。

    1. HttpSession session = .getSessin();
      hohoClass clazz = new hohoClass();
      clazz.buff = "ABC";
      session.setAttribute("hoho", clazz);
    2. clazz.buff = "DEF";
    3. session.setAttribute("hoho", clazz);
    4. hohoClass clazz2 = (hohoClass)session.getAttribute("hoho");
      String buff = clazz2.buff;

  3. セッションレプリケーションを設定するとセッション情報がJNDIに格納されるようになります。この際セッションに格納しているオブジェクトに関して注意点があります。

    セッション情報として、VectorやHashtableなど、同期化されたコレクションクラスを使用すると、シリアライズ/デシリアライズが同期化されてしまいます。同期化されてしまうと処理が直列化されて、大幅な性能低下につながるおそれがあります。そのためVectorやHashtableではなく同期化されないArrayListやHashMapをご使用ください。

    また、シリアライズ/デシリアライズは複雑なコレクションクラスの処理には時間が掛かります。セッション情報として使用するオブジェクトはシンプルなものをお勧めします。