2011-10-31 114 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你不应该用正确的代码编辑你的问题。它在阅读时造成混乱 –

相关问题