嘿伙计们,我正在为我的项目管理模块。当一个人登录时,会向登录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);
这里LoginService是登录模块的bean类。我在这里得到一个nullpointer异常。
答案 0 :(得分:3)
我认为你正在尝试做你的web容器应该为你处理的东西...会话应该在同一个客户端会话的多个servlet调用的过程中自动维护。来自HttpServlet
的方法获得HttpServletRequest
。您可以使用该类的HttpSession
方法之一获取相应的getSession
。
您可以使用HttpSession
和setAttribute
将内容绑定到getAttribute
。
编辑:我是从Servlet规范2.5中获取的:
servlet可以通过名称将对象属性绑定到HttpSession实现中。 绑定到会话的任何对象都可用于属于该会话的任何其他servlet 相同的ServletContext并处理被识别为同一个请求的请求 会话。
我认为你最好从HttpServletRequest获取HttpSession对象(至少假设它是一个HttpServlet)并通过它设置/获取属性。如果为属性选择了正确的名称(它遵循与Java包命名相同的约定),则可以确保返回的对象(只要它不为null)可以转换为放在那里的任何类型。设置和获取请求本身的属性不会有帮助,我不认为东西会从一个servlet调用转移到下一个servlet调用,除非你使用RequestDispatcher
从另一个调用一个servlet,但这不是你在这里的目的是什么。
所以在你的第二个代码示例中,做(LoginService)request.getSession().getAttribute("currentSessionUser");
,这应该有效。确保检查空值,并选择使用项目包名称约定的属性名称(如com.mycompany...
)。
我不介意第二意见,因为我不是EE / web开发人员。