- PR -

Sessionの取り扱いについて相談

1
投稿者投稿内容
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2006-10-25 10:46
お世話になっております。

今、別ユーザでログイン、という機能を考察しています。
この機能は次のような要求で成り立っています。
・現在ログイン中のユーザのセッションと保持している情報は破棄する
・ただし、セッション内に保持しているHistoryオブジェクトは引き継がせる
(Historyオブジェクトは過去10画面分の画面遷移情報を保持しています)

この要求に対し、次のような設計を考えて見ました。
コード:
HttpSession session = request.getSession(false);

History history = session.getAttribute(KEY_HISTORY);
session.invalidate();

session = request.getSession(true);
session.setAttribute(KEY_HISTORY, history);


 Historyオブジェクトを一旦退避し、
 セッションをinvalidateした後
 セッションを再作成し、
 Historyオブジェクトを格納する、
という流れです。

invalidateした後そのままgetSessionする、見たいな事
普通に行うものなのでしょうか。
このような使い方をして何か問題が起きないのかと心配している次第です。

問題ないという意見、問題あるという意見
ございましたらどうかよろしくお願いいたします。

なお、環境はJDK1.4.2_8、J2EE1.3.1、TOMCAT1.4.30になっています。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2006-10-25 23:03
多分大丈夫だと思うんですけど。
問題があるようでしたら僕も知りたいですね。
セッションリスナ関連と併用していたら
どうなるのかは気になるところですが。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-10-26 01:11
Session Fixation対策の定番なので大丈夫だと思いますよ。
http://www.atmarkit.co.jp/fsecurity/rensai/struts04/struts03.html

注意すべき点としては、javax.servlet.http.HttpSessionListenerや
javax.servlet.http.HttpSessionBindingListenerが仕掛けられている場合に、
HttpSession#getAttributeNames()を使って全体を移住させると思わぬ挙動を
するかもしれないです。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-10-26 01:21
忘れてました。

J2EEフォーム認証を使っているとよろしくないです。
この場合はログイン前後の判断に使えるのはHttpServletRequestの
getUserPrincipal()やgetRemoteUser()が非nullを返すかくらいなので、
invalidate()しちゃうと認証情報も一緒にクリアしちゃってループします。

何とかする方法ってあるんでしょうかね?
とりあえず、私は知らないです。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2006-10-26 08:55
ご意見ありがとうございます
引用:
Listener


こいつの存在をすっかり失念しておりました。
セッションに格納されていたオブジェクトにListenerが仕掛けてあると
その動作によってはシステムが誤作動することがありますね。
例えばDBコネクションを破棄しちゃうとか。
しかもHistoryにHistoryを消去するようなListenerがあったいすると・・・。

引用:
Session Fixation対策


これはLogin用のセッションに格納するオブジェクトに
余計なListener処理が入ってないことが前提になるのだと思います。

引用:
J2EEフォーム認証


なるほど。
J2EEフォーム認証はまだ使ったことがなかったので
まったく考慮に入れていませんでした。
今後J2EEフォーム認証を使う機会を得られた場合は
注意しないといけませんね。

ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)