Java 如何从两个不同的jsp页面访问同一个会话对象?

Java 如何从两个不同的jsp页面访问同一个会话对象?,java,html,jsp,session,servlets,Java,Html,Jsp,Session,Servlets,我正在创建的网站需要跨多个.jsp页面访问相同的会话属性。最初,该属性是在我的Login.java servlet中设置的,在第一次页面重定向之后,我能够获得该属性的正确值,但是一旦页面再次重定向,该属性始终为空。两个相关的servlet是Login.java,我首先给属性一个值,然后给Controller.java,我在页面之间导航。我最初的想法是,问题是由于我切换.jsp页面(response.redirect(…)的方式造成的,因此我将其修改为使用RequestDispatcher,但是这

我正在创建的网站需要跨多个.jsp页面访问相同的会话属性。最初,该属性是在我的Login.java servlet中设置的,在第一次页面重定向之后,我能够获得该属性的正确值,但是一旦页面再次重定向,该属性始终为空。两个相关的servlet是Login.java,我首先给属性一个值,然后给Controller.java,我在页面之间导航。我最初的想法是,问题是由于我切换.jsp页面(response.redirect(…)的方式造成的,因此我将其修改为使用RequestDispatcher,但是这并没有改变产生的错误,因为从Login.java重定向之后的每一页中CustomerObject属性仍然为空

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
}
%>

更新0:我在每个页面上打印了session.getId()和request.getSession(false).getId(),发现正如预期的那样,在每个页面中,ID都是相同的,但是testdynamicbuild.jsp的ID与graphdisplay.jsp的ID不同。如果我的理解是正确的,这意味着每次页面更改时都会创建一个新会话,即使我使用request.getSession(false)。有什么意见吗

更新1:我在Controller.java中添加了一个print语句,以打印request.getSession(false)是否为null,并且每次执行Controller.java时,request.getSession(false)都返回一个null值。如果我没有弄错的话,这意味着错误与会话对象直接相关。是否需要在index.html中显式创建会话对象


更新2:在搜索更多内容时,我在这里找到了一个会话对象教程,并将其部署到我正在使用的服务器上。在访问页面时,每次刷新都会创建一个新会话。是否有任何服务器端可能会导致这样的错误?

属性仅适用于一个作用域,因此当您执行转发/重定向时,该作用域将丢失。然后所有属性都被删除,代码中对它们的引用将返回null


您需要将您的值存储在会话对象中,然后它们将在整个重定向过程中保持可访问性。当您访问它时,请不要忘记将其从会话中删除(如果需要)。

如果登录方法返回空值,您是否可以调试并检查是否调用了setAttribute方法*会话属性在用户会话中保持不变,在页面之间导航不会影响会话。您的代码中应该有一个bug。当登录重定向到testdynamicbuild.jsp时,我可以执行session.getAttribute(“CustomerObject”)并让它在.jsp中返回正确的值。但是,当testdynamicbuild.jsp重定向到另一个.jsp(如graphdisplay.jsp)时,然后是session.getAttribute(“CustomerObject”)始终返回null。看起来您的代码正在创建新会话,而它应该使用当前会话。检查jsp scriplets中的use request.getSession(false)链接。我在所有.jsp页面中使用request.getSession(false)对其进行了测试,但是仍然出现相同的空错误。也许这与下面@bluedevil2k的答案有关?我如何将该值存储在会话对象中,而不是将其存储为属性?此答案仅适用于请求属性,而不适用于会话属性。