■質問日: |
2007/02/07 |
■最終更新日: |
2007/06/15 |
■質問内容: |
Webアプリケーションを運用中、APサーバを再起動しました。 利用中の人がログアウトせずに、そのまま画面上のボタンを押したところ、 他の人の画面が表示される場合があります。 セッション管理:WDCのBasicSessionを利用(HttpSessionは利用せず) |
■回答内容: |
WDC 1.30-016以前(1.30-016は含まず)のBasicSessionは"S"+ハッシュコード値(7桁程度の16進数)という非常に短い、セッションIDでセッションを 管理しています。 このため、APサーバを再起動すると、再起動前に利用していた人と同一のセッションIDが 振られる可能性があります。 その場合、他人のセッションに接続されてしまう可能性があります。 回避方法 A)WDC 1.30-016以降にリビジョンアップする。 (WDC 1.20系の場合は、1.20-047p11でも可) B)HttpSessionを利用する。 HttpSessionを利用した場合は、APサーバが重複しないセッションIDを発行しますので、他の人のセッションが参照されることはありません。 C)BasicSessionを拡張し、重複しないセッションIDを割り振るようにする。 具体的なコード例は添付資料を参照してください。 |
■添付資料: |
//セッション変数を'S' + タイムスタンプ + 乱数 + ハッシュ値とする例 ServletBase継承クラスのinit()メソッド setSessionClassName(jp.co.tenartni.session.MyBasicSession.class.getName()); その他省略 MyBasicSessionクラス package jp.co.tenartni.session; import jp.co.tenartni.xsv.*; public class MyBasicSession extends BasicSession { private static final long seedOffset = 1234567890L; private static final java.util.Random random = new java.util.Random(System.currentTimeMillis() + seedOffset); //コンストラクタ public MyBasicSession() { super(); // 'S' + タイムスタンプ + 乱数 + ハッシュ値 の形式とする. // ※注 下記はあくまでもサンプルです。 // 実際に使用する場合は、乱数の取得方法を改善するなど、 // 適宜、工夫してください。 final int rand = random.nextInt(Integer.MAX_VALUE); this.sessionID = "S" + Long.toString(this.getLastSessionTime().getTime(), 36) + "_" + Integer.toString(rand, 36) + "_" + Integer.toHexString(this.hashCode()); } } |