2011-10-31 106 views
0

嘿傢伙我正在爲我的項目管理模塊。當一個人登錄時,一個請求被髮送到登錄servlet。當通過點擊其他選項進一步要求其他報告時,將報告請求發送到其他servlet,該servlet在用戶正在顯示的頁面上顯示結果。會話在兩個servlet之間丟失。如何將會話從一個servlet轉發到另一個?

我想導航一些其他頁面上生成的報告,但爲此我需要知道第二個servlet中的用戶類型。這可以通過從登錄模塊bean類中獲取user_type的值來完成。

如何處理這種情況?感謝

我登錄的servlet:

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 
      } 

我試圖在第二個servlet使用這個: -

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

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

這裏login服務是bean類登錄模塊。我在這裏得到一個空指針異常。

+0

爲什麼會話中的用戶是「LoginService」的實例?是一個URL HTTP還是一個HTTPS?如果是這樣,您應該能夠配置兩個協議之間的會話共享。 –

+0

@DaveNewton我認爲'LoginService'是他自己定義的一些類。他添加了他創建它的代碼片段並將其設置爲會話屬性。 –

+0

@G_H我明白了;我的觀點是,這對用戶來說是一個愚蠢的名字。正如第二個servlet中的'session'一樣。命名事項:) –

回答

3

我認爲你正在嘗試做你的web容器應該爲你處理的東西......一個會話應該在來自同一個客戶端會話的多個servlet調用過程中自動保持。來自HttpServlet的方法給出HttpServletRequest。您可以使用該類的getSession方法之一獲得相應的HttpSession

您可以使用setAttributegetAttribute將東西綁定到HttpSession

編輯:我和Servlet 2.5規範服用此:

servlet可綁定一個對象的屬性到由名字一個HttpSession的實現。 綁定到會話中的任何對象都可用於任何屬於同一ServletContext的其他Servlet,並處理標識爲同一會話的一部分的請求。

我認爲你最好從HttpServletRequest獲取HttpSession對象(至少假設它是一個HttpServlet)並通過它設置/獲取屬性。如果您爲屬性選擇了一個適當的名稱(它遵循與Java包命名相同的約定),那麼可以確保返回的對象(只要它不爲null)可以轉換爲您放入其中的任何類型。設置和獲取請求本身的屬性不會有幫助,我不認爲這些東西會從一個servlet調用轉移到另一個,除非您使用RequestDispatcher調用另一個servlet,但這不是您在這裏之後。

因此,在你的第二個代碼示例中,應該工作(LoginService)request.getSession().getAttribute("currentSessionUser");。確保檢查空值,並可能選擇使用項目的包名稱約定的屬性名稱(如com.mycompany...)。

我不會介意第二種意見,因爲我不是EE/Web開發人員。

+0

我已經編輯我的問題與我在第二個servlet中試圖獲取會話屬性的代碼。建議更改。謝謝 – Dhruv

+0

謝謝,它的工作:) – Dhruv

+0

@Dhruv你不應該用正確的代碼編輯你的問題。它在閱讀時造成混亂 –

相關問題