- - PR -
session生成タイミングのコントロール
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-11-05 21:23
いつもお世話になっています。
Sessionに関する質問です。 現在、Webアプリケーションの認証処理を作成しており、以下のコードを利用しています。 if (session == null && request.getParameter("flag") != null) { // ログインプロンプト表示 System.out.println("ログイン画面へ誘導"); RequestDispatcher dispatcher = filterConfig.getServletContext(). getRequestDispatcher("/Login.jsp"); dispatcher.forward(request, response); } 上記のコードでログイン画面に移った後、認証に成功したらsession取得、 とやりたいのですが、困ったことに上記のdispatcher.forward(request, response)のところで、 勝手にsessionが生成されてしまっています。 RequestDispatcherの仕様ということはないはずですが、なぜそうなってしまうのか分かりません。 原因、対処法など、情報をお持ちでしたら、ご教授ください。 | ||||
|
投稿日時: 2004-11-05 21:57
sessionの詳細については他の方の説明か、ご自分で調べていただくとして
HttpSession#isNew()とかは使えないでしょうか? しかしそれを行っても if (session == null && request.getParameter("flag") != null) の条件では request.getParameter("flag") != null ↑この部分をユーザが操作できてしまうので 意味ないです もし私が同じ事をやる場合は 何らかのユーザオブジェクトをセッションに設定しておき session.getAttribute("hoge")==null || !((Hoge)session.getAttribute("hoge")).isLogedIn() であれば、所定のページに飛ばすとか・・・ [ メッセージ編集済み 編集者: sakura 編集日時 2004-11-05 22:00 ] [ メッセージ編集済み 編集者: sakura 編集日時 2004-11-05 22:01 ] | ||||
|
投稿日時: 2004-11-05 22:50
これはどのような理由からそのようにお考えになったのですか? | ||||
|
投稿日時: 2004-11-06 00:20
YOU@ITさん
> これはどのような理由からそのようにお考えになったのですか? listenerで捕まえたsessionCreatedのイベントをログ 出力しています。 ソース中にprint文を埋め込んで、細かく調べたところ dispatcher.forward(request, response); のタイミングで、sessionが生成されていることがわかりました。 なお、その後の調査で、forward先が静的なHTMLの場合、sessionは生成されないが、 forward先がJSPの場合は、sessionが生成されるという現象を確認しました。 そこで、いまは回避策として、JSPの冒頭でsession.invalidate()を実装しています。 これはRequestDispatcherの仕様なのでしょうか?それともバグ? あるいはやはりアプリケーションの問題なのでしょうか? アプリケーションのコードを疑って吟味してみましたが、 非常にシンプルな実装ですし、問題があるようには思えないのです。 何かご存じでしたら、ご教授ください。 よろしくお願いします。 | ||||
|
投稿日時: 2004-11-06 00:27
sakuraさん
おっしゃるとおりですね。 アプリケーションで確実にコントロールできる方法で 制御するほうが優れたやりかただと思います。 sessionの問題はそれとして解決しておきたいのですが、 思わず別解を与えていただき感謝です。 ご教授いただいた方法を利用させていただきます。 ありがとうございました。 | ||||
|
投稿日時: 2004-11-06 00:43
単に、自分で意識せずにセッション作ってるだけですね。 | ||||
|
投稿日時: 2004-11-06 01:03
未記人さん
>単に、自分で意識せずにセッション作ってるだけですね。 詳しく説明していただけますでしょうか? ちなみにセッションはアプリケーションが「作る」ものではないですよね? アプリケーションはコンテナが作ったセッションを リクエストにバインドするだけだと理解していますが、 私の理解は間違っていますか? また、自分で意識せずにそういうことをやってしまう場合というのは 例えばどういうケースでしょうか? 自分なりに調べたつもりですが、わかりません。 よろしくお願いします。 | ||||
|
投稿日時: 2004-11-06 01:09
http://www.atmarkit.co.jp/fjava/javafaq/jsp/jsp06.html |