2010-12-29 6 views
0

Ich habe eine "Nachschlagen" HTML-Seite, die zusammen mit einer Java-HttpServlet-Klasse funktioniert, die einige Funktionalität behandelt und die Ergebnisse an eine JSP-Seite sendet.Wie man ein Sitzungsattribut am Leben erhält

Um die Suche durchzuführen, brauche ich ein Login-Ergebnis-Objekt, das ich in die Sitzung in einem anderen Servlet eingefügt habe.

Dies ist, was im Login-Servlet passiert:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html"); 
     PrintWriter out = response.getWriter(); 
     // get attributes that were filled in on the login webpage 
     request.getAttribute("username"); 
     request.getAttribute("password"); 
     String username = request.getParameter("username"); 
     String password = request.getParameter("password"); 
     LoginManager loginManager = new LoginManager(username.trim(), password.trim()); 
     if (loginManager.doLogin() == true) { 
      javax.servlet.http.HttpSession session = request.getSession(); 
      session.setAttribute("loginResult", loginManager.getLoginResult()); 
      session.setAttribute("binding", loginManager.getBinding()); 
      response.sendRedirect("lookup.html"); 

Dies ist, was auf dem Servlet

request.setCharacterEncoding("UTF-8"); 
      response.setContentType("text/html"); 
      javax.servlet.http.HttpSession session = request.getSession(); 
      LoginResult lr = (LoginResult) session.getAttribute("loginResult"); 
      if(lr == null) 
      { 
       throw new Exception("Your session has expired, please log in again"); 
      } 

      // some look up code 

      RequestDispatcher dispatcher = request.getRequestDispatcher("result.jsp"); 
      request.setAttribute("result", result); 
      request.setAttribute("question", question); 
      request.setAttribute("xml", xml); 
      dispatcher.forward(request, response); 

In meiner jsp Seite wird eine Eingabeknopf aufblicken geschieht, die die folgenden: ONCLICK = "window.location.href = 'lookup.html'" />

Manchmal, wenn ich meine Ergebnisseite unkonzentriert lasse oder minimiere oder was auch immer, oder ich warte zu lange und klicke auf die Rückkehr zur Nachschlagenpag e es scheint, dass mein logingergebnis objekt == null. Also meiner Meinung nach scheint es abgelaufen zu sein. Obwohl ich dachte, dass der Apache Tomcat Server Sitzungen für 30 Minuten am Leben hält.

Irgendeine Vermutung, warum mein Sitzungsattribut verschwindet?

+0

Ich denke, um einen sinnvollen Vorschlag zu machen, sollten Sie den Code veröffentlichen, der enthält, wie Sie das Sitzungsattribut erstellen und wie Sie es später verwenden. –

+0

die Formulierung "Rückkehr zur Lookup-Seite" ist unklar. meinst du - du loggst ein, dann gehst du auf die Nachschlageseite, dann verlässt du die Seite für einige Zeit, und dann siehst du deine geöffnete Seite wieder (was ist die Nachschlageseite) und die Sitzung verschwindet? was meinst du mit "return" genau? –

+0

Nach dem Einloggen gelangen Sie auf die Nachschlageseite. Von der Nachschlage-Seite können Sie etwas abfragen. Die Ergebnisse werden auf der Ergebnisseite angezeigt. Auf der Ergebnisseite können Sie zur Nachschlageseite zurückkehren. Solange die Sitzungsattribute existieren, können Sie erneut abfragen. Daher möchte ich, dass die Sitzung so lange dauert, wie der Browser eines Benutzers geöffnet ist. –

Antwort

1

Zuerst sollten Sie feststellen, ob Sie tatsächlich die gleiche Sitzung erhalten oder nicht. Es gibt 2 einfache Möglichkeiten, die ich mir vorstellen kann.

1.) Sehen Sie sich den Inhalt des JSESSIONID-Cookies an. Die meisten Browser machen das trivial. Wenn sich der Inhalt ändert, haben Sie eine andere Sitzung erhalten.

2.) Sie könnten versuchen, einen HttpSessionListener anzuschließen, um zu protokollieren, wenn Ihre Sitzungen zerstört werden.

Wenn Sie eine neue Sitzung erhalten, müssen Sie diese auf ein Konfigurationsproblem (Tomcat, web.xml, Kontext-Snippet usw.) oder ein App-Problem eingrenzen. Wenn es sich um ein Konfigurationsproblem handelt, sollte das Problem auf anderen als den angegebenen Seiten wiederholbar sein.

Denken Sie auch über die Verwendung von getSession (false) nach, wodurch keine neue Sitzung erstellt wird, wenn keine bereits vorhanden ist. Wenn Sie davon null erhalten, ist dies ein weiterer Hinweis darauf, dass Ihre Sitzungen ein Zeitlimit aufweisen.

Wenn Sie feststellen, dass Sie dieselbe Sitzung haben, aber aus irgendeinem Grund verschwinden Attribute, können Sie einen HttpSessionAttributeListener und Protokoll oder Haltepunkt implementieren, wenn Elemente aus der Sitzung entfernt werden.

+0

Danke das hat mir sehr geholfen. Es scheint, dass, wenn ich auf die Ergebnisseite komme und ich ein neues Browserfenster öffne und ich meine Ergebnisseite unfokussiert lasse, nach einer Minute oder 2 wird die httpsession zerstört. –

Verwandte Themen