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

时间:2015-07-13 14:28:04

标签: java html jsp session servlets

我创建的网站需要跨多个.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找到的会话对象教程,并将其部署到我正在使用的服务器上。在访问该页面时,它仍会在每次刷新时创建一个新会话。是否有任何服务器端可能导致此类错误?

1 个答案:

答案 0 :(得分:-1)

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

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