我创建的网站需要跨多个.jsp页面访问相同的会话属性。最初,该属性在我的Login.java servlet中设置,在第一次页面重定向之后,我能够获得该属性的正确值,但是一旦重定向页面,该属性始终为null。两个相关的servlet是Login.java,我首先给属性一个值和Controller.java,我在页面之间导航。我最初的想法是问题是由于我切换.jsp页面(response.redirect(...))的方式,所以我修改它以使用RequestDispatcher,但是这并没有改变产生的错误,因为CustomerObject在从Login.java重定向之后的每个页面中,属性仍为null。
Login.java
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String email = request.getParameter("email");
String password = request.getParameter("password");
HttpSession session = request.getSession();
Customer customer = (Customer)session.getAttribute("CustomerObject");
if (customer == null) {
customer = CustomerBean.login(email, password);
if (customer != null) {
request.getSession().setAttribute("CustomerObject", customer);
}
}
response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/html");
RequestDispatcher rd = request.getRequestDispatcher("testdynamicbuild.jsp");
rd.forward(request, response);
}
Controller.java
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String forward = "";
String temp = request.getParameter("pageLink");
if(temp != null){
temp = temp.toLowerCase();
if(temp.equals("graph")){
forward = "graphdisplay.jsp";
}else if(temp.equals("sideMenu")){
forward = "sidemenu.html";
}else if(temp.equals("log")){
forward = "logdisplay.jsp";
}else if(temp.equals("vardisp")){
forward = "testdynamicbuild.jsp";
}else if(temp.equals("home")){
forward = "index.html";
}else if(temp.equals("side")){
forward = "sidemenu.jsp";
}else{
forward = "index.html";
}
}else{
forward = "errorpage.html";
}
response.setHeader("Cache-Control", "no-cache");
response.setContentType("text/html");
RequestDispatcher rd = request.getRequestDispatcher(forward);
rd.forward(request, response);
}
来自.jsp页面的访问示例
<%
Customer c = null;
if( request.getSession().getAttribute("CustomerObject") != null){
c = (Customer)request.getSession().getAttribute("CustomerObject")
}else{
// handle null object
}
%>
UPDATE 0:我在每个页面上打印出session.getId()和request.getSession(false).getId(),并在每个页面中发现了ID&# 39; s是相同的,但例如testdynamicbuild.jsp的ID与graphdisplay.jsp的ID不同。如果我的理解是正确的,这意味着每次页面更改时都会创建一个新会话,即使我使用request.getSession(false)。有什么输入?
UPDATE 1:我向Controller.java添加了一个print语句,以打印request.getSession(false)是否为null,并且每次执行Controller.java时,request.getSession( false)返回一个空值。如果我没有弄错的话,这意味着错误与会话对象直接相关。是否需要在index.html?
中明确创建会话对象更新2 :在搜索更多内容时,我遇到了link找到的会话对象教程,并将其部署到我正在使用的服务器上。在访问该页面时,它仍会在每次刷新时创建一个新会话。是否有任何服务器端可能导致此类错误?
答案 0 :(得分:-1)
属性仅适用于一个范围,因此当您执行转发/重定向时,范围将丢失。然后删除所有属性,并且在代码中对它们的引用将返回null。
您需要将您的值存储在Session对象中,然后在整个重定向过程中都可以访问它们。当你访问它时,不要忘记从会话中删除它(如果你需要)。