2011-10-31 20 views
0

ちょっと私は私のプロジェクトの管理モジュールに取り組んでいます。人がログインすると、ログインサーブレットにリクエストが送信されます。さらに他のオプションをクリックして他のレポートを要求すると、レポートのリクエストが他のサーブレットに送信され、通常のタイプのユーザーの時刻に表示されるページの結果が表示されます。セッションは2つのサーブレット間で失われます。あるサーブレットから別のサーブレットにセッションを転送する方法は?

他のページで生成されたレポートをナビゲートしようとしていますが、そのためには第2サーブレットのユーザータイプを知る必要があります。これは、ログインモジュールBeanクラスからuser_typeの値を取得することで実行できます。

このような状況を処理するにはどうすればよいですか?おかげ

は私のログインサーブレットは次のとおりです。

LoginService user = new LoginService(); 
       user.setUserName(request.getParameter("username")); 
       user.setPassword(request.getParameter("password")); 

       user = UserDAO.login(user); 

       if (user.isValid()) 
       { 

         HttpSession session = request.getSession(true);  
         session.setAttribute("currentSessionUser",user); 



         if(user.getUser_type().equalsIgnoreCase("admin")){ 

          response.sendRedirect("administrator/homepage.jsp"); 
         }else{ 

         response.sendRedirect("homepage.jsp"); //logged-in page 
         } 
       } 

       else 
         response.sendRedirect("invalidlogin.jsp"); //error page 
      } 

私は2番目のサーブレットでこれを使用してみました: -

LoginService session = (LoginService)request.getAttribute("currentSessionUser"); 

      String drake = session.getUser_type(); 
      System.out.println("usertype = " +drake); 

ここでLoginServiceはログインモジュールのBeanクラスです。私はここでnullpointer例外を取得します。

+0

なぜセッション中のユーザーが 'LoginService'のインスタンスですか? 1つのURLのHTTPと1つのHTTPSですか?その場合は、2つのプロトコル間でセッション共有を設定できる必要があります。 –

+0

@DaveNewton 'LoginService'は自分が定義したクラスだと思います。彼はコードスニペットを作成し、セッション属性として設定します。 –

+0

@G_H私はそれを理解しています。私の指摘は、それはユーザーのための愚かな名前だということです。セカンドサーブレットの 'session'もそうです。名前付けの問題:) –

答えて

3

あなたは、あなたのWebコンテナがあなたのために処理すべきものをやろうとしていると思います...セッションは、同じクライアントセッションからの複数のサーブレット呼び出しの間に自動的に維持されます。 HttpServletからの方法には、HttpServletRequestが与えられている。そのクラスのgetSessionメソッドの1つを使用して対応するHttpSessionを取得できます。

setAttributegetAttributeを使用してHttpSessionに品物をバインドできます。

EDIT:私はサーブレット仕様2.5からこれを取っている:

サーブレットは、名前でのHttpSessionの実装にオブジェクト属性をバインドすることができます。 セッションにバインドされたオブジェクトはすべて、同一のServletContext に属し、同じ セッションの一部であると識別された要求を処理する他のサーブレットで使用できます。

私はあなたが(少なくともそれはHttpServletのだと仮定して)のHttpServletRequestからHttpSessionオブジェクトを取得し、その通過の属性を取得/設定するほうだと思います。あなたの属性に適切な名前(Javaパッケージ命名規則と同じ規則に従います)を選択すると、返されたオブジェクトは、nullでない限り、そこに置かれた型にキャストできます。リクエスト自体の属性を設定したり取得したりすることは助けにならないでしょう。あなたがRequestDispatcherで1つのサーブレットを呼び出さない限り、あるサーブレットコールから次のサーブレットコールに持ち越されるものはありませんが、それはあなたのものではありません後に

したがって、2番目のコードサンプルでは、​​動作するべきである(LoginService)request.getSession().getAttribute("currentSessionUser");を実行してください。 nullをチェックして、プロジェクトのパッケージ名の規則(たとえばcom.mycompany...)を使用する属性名を選択するようにしてください。

私はEE/Web開発者ではないので、ここで第二の意見は気にしません。

+0

セッション属性を取得するために2番目のサーブレットで試したコードで質問を編集しました。変更を提案する。 Thanks – Dhruv

+0

ありがとう、それは動作します:) – Dhruv

+0

@Dhruv正しいコードで質問を編集してはいけません。読んでいる間に混乱を招く –

関連する問題