簡體   English   中英

如何從兩個不同的jsp頁面訪問同一會話對象?

[英]How can the same session object be accessed from two different jsp pages?

我正在創建的網站需要跨多個.jsp頁面訪問相同的會話屬性。 最初,屬性是在我的Login.java servlet中設置的,並且在第一頁重定向之后,我能夠獲得該屬性的正確值,但是一旦頁面再次被重定向,該屬性始終為null。 這兩個相關的servlet是Login.java(在這里我首先給該屬性賦值)和Controller.java(在這里我在頁面之間導航)。 我最初的想法是問題是由於我切換.jsp頁面(response.redirect(...))的方式造成的,所以我對其進行了修改以使用RequestDispatcher,但是並沒有改變結果錯誤,例如CustomerObject在從Login.java重定向后緊接的每一頁之后,每頁中的attribute屬性仍然為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相同,但testdynamicbuild.jsp的ID示例與graphdisplay.jsp的ID不同。 如果我的理解是正確的,則意味着即使我使用request.getSession(false),每次頁面更改時都會創建一個新會話。 有什么意見嗎?

更新1:我在我的Controller.java中添加了一條打印語句,以打印request.getSession(false)是否為null,並且每次執行Controller.java時,request.getSession(false)返回一個null值。 如果我沒記錯的話,這意味着該錯誤與會話對象直接相關。 是否需要在index.html中顯式創建會話對象?

更新2:當進行更多搜索時,我遇到了在此鏈接中找到的會話對象教程,並將其部署到了正在使用的服務器上。 訪問頁面后,每次刷新仍會創建一個新會話。 服務器端是否有任何可能導致此類錯誤的信息?

屬性僅對一個作用域有效,因此當您進行轉發/重定向時,作用域將丟失。 然后所有的屬性都將被刪除,您在代碼中對它們的引用將返回null。

您需要將值存儲在Session對象中,然后在整個重定向過程中它們仍然可訪問。 只是不要忘記在訪問它時將其從會話中刪除(如果需要)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM