- PR -

FORM認証後の処理を指定する方法は

1
投稿者投稿内容
n-squid
会議室デビュー日: 2004/09/17
投稿数: 14
投稿日時: 2007-05-22 10:06
こんにちは。お世話になります。
以下の環境でWebアプリの開発をしています。

Webサーバ : Apache2.0.46
サーブレットコンテナ : Tomcat5.5.23
JVM : jre1.5.0_11-b03

TomcatのFORM認証を利用した認証を行っています。
セッションがタイムアウトになった場合、ユーザーからのリクエストがあると
再度認証画面が表示され、認証の成功後リクエストされた処理が実施されること
になると思います。
この場合、リクエストされた処理の内容によってはデータの引継ぎにセッション
を利用しているため、NullPointerException等の例外が発生してしまい処理が
エラー終了となってしまいます。
ひとつずつ例外が発生しそうな部分をキャッチして行けば解消されるとは思う
のですが、既に開発が進んでしまっているため全て潰していくのも困難な状況
です。
FilterでRefererの値をチェックし、トップページに飛ばす方法も試しましたが、
当然ながらコンテキスト外からのアクセスには有効でしたが、コンテキスト内
からのアクセスでセッションが切れているものには対応できません。
認証後の処理等が指定できれば、認証後は全てトップページに飛ばす、等で解消
したいのですが、何か良い方法はありませんでしょうか。
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-05-22 12:41
認証時にsessionを新規作成していますか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-05-22 13:04
NullPointerExceptionの原因がセッション切断前にSessionオブジェクトに
addAtribute()していたオブジェクトが消失するから、というのであれば
簡便な対処法はありません。

まずは本質的な情報のフローを整理する必要があります。
どういうオブジェクトが何時セッションに格納されて、
いつ更新されて、いつ破棄されるのか?

ログインユーザ情報などの、セッション継続中は常時存在する
オブジェクトは際ログインによって復旧すればよいので問題ありません。

そうではなく、直前の操作によって一時的に格納している類のオブジェクトの
扱いというのは常に厄介で、扱う際はいつも存在しなくなっている可能性を
考慮しなくてはなりません。
(java.lang.refパッケージのSoftReferenceや、WeakReferenceを扱う
 ときのように常に値がなくなることをチェックする必要がある)

また、セッションはブラウザを複数立ち上げて操作することで容易に
マルチスレッド特有のバグを誘発するので、出し入れの操作、および
取得したオブジェクトに対する操作に関しては排他制御を必要とします。

これらはシステム設計の段階で十分に留意しなくてはなりません。
後付でこれらの対処を行おうとする場合、相応の工数が必要となります。

Filterなどを利用して、処理開始前に前提条件を満たしているかを確認し
異常時には初期画面に差し戻すような対処をすることで、
暫定的に逃れることはできるかもしれません。(顧客との交渉次第)
n-squid
会議室デビュー日: 2004/09/17
投稿数: 14
投稿日時: 2007-05-22 13:29
認証時にsessionを新規作成しているかどうかですが、Filterで以下のように
getSessionを記述しています。

HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
HttpSession session = req.getSession();
if (session.isNew()) {
res.sendRedirect(config.getInitParameter("StartPage"));
}

ここでのsession.isNew()でセッションが新規なのかどうかを判定し、新規だった
らトップページ飛ばすことを考えたのですが、ここでsession.isNew()は常にfalse
を返して来ています。
1

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