2012-08-09 64 views
0

我在數據庫中存儲會話ID在log in時間。我面臨的問題是,如果不同的用戶在第一個登錄後登錄,則同一個會話將在DB中輸入,並且welcome username仍然會反映首先在同一臺計算機上登錄的用戶的名稱。我想每次用戶登錄時創建一個新的會話ID,但不知何故,我的代碼不起作用。如何在Java Servlets中強制創建一個新會話

HttpSession session = request.getSession(); 
String sessionID; 
request.getSession(true); 
sessionID = session.getId(); 

注意:當用戶點擊登錄按鈕並且它包含在一個servlet中時,上述代碼被調用。

會話ID仍舊具有會話的舊值,直到默認舊會話過期。這意味着如果有10個用戶登錄,所有用戶將擁有相同的會話ID和相同的歡迎名稱。

需要來自這裏的專家的專家建議:)。如果我錯過了需要提供的任何細節,請告訴我。

如果我使用 -

if(session.isNew()){ 
      System.out.println("New session created by default"); 
      request.getSession(true); 
      sessionID = session.getId(); 
      createTime = new Date(session.getCreationTime()); 
      lastAccessTime = new Date(session.getLastAccessedTime()); 
      initialtime = System.currentTimeMillis(); 
     }else{ 
      System.out.println("You have created a new session"); 
      request.getSession().invalidate(); 
      request.getSession(true); 
       sessionID = session.getId(); 
      createTime = new Date(session.getCreationTime()); 
      lastAccessTime = new Date(session.getLastAccessedTime()); 
      initialtime = System.currentTimeMillis(); 
     } 

得到下面的例外 -

SEVERE: Servlet.service() for servlet LoginToApp threw exception 
java.lang.IllegalStateException: getCreationTime: Session already invalidated 
    at org.apache.catalina.session.StandardSession.getCreationTime(StandardSession.java:1025) 
    at org.apache.catalina.session.StandardSessionFacade.getCreationTime(StandardSessionFacade.java:74) 
    at LoginToApp.doGet(LoginToApp.java:56) 
    at LoginToApp.doPost(LoginToApp.java:208) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:843) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:679) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1303) 
    at java.lang.Thread.run(Thread.java:595) 
+1

我會說你的註銷已經損壞了。或者你的登錄。或兩者。 – 2012-08-09 15:43:30

+0

我不這麼認爲,Dave.Login只是一個html頁面,所有的東西都在這裏的servlet中處理。 – anujin 2012-08-09 15:44:55

+0

真的嗎?嗯。因爲通常在註銷時你會使當前會話無效(或者如果你沒有註銷,或者你應該運行註銷代碼,則在登錄時)。但會話ID並不是真正的門控問題 - 會話中*是最重要的事情。如果會話或數據庫中仍有舊數據,則登錄或註銷都會中斷(或兩者都有)。 – 2012-08-09 15:49:44

回答

1

session變量設置爲新的會話:你想用舊的工作,無效的。

+0

我該怎麼做?你的想法好嗎? – anujin 2012-08-09 16:06:56

+0

謝謝戴夫。你的答案幫了我,我在 - [killsession]找到了詳細信息(http://stackoverflow.com/questions/5404907/kill-user-session)。 – anujin 2012-08-09 16:16:50

+0

@anujin很高興你能解決這個問題 - 但將變量設置爲新值不應該需要任何研究,不是嗎? – 2012-08-09 16:56:44

0

首先,您必須在註銷時使會話無效,即刪除服務器及其相關數據中的會話。

實際上,會話ID也存儲在客戶端瀏覽器cookie中,名稱爲jsessionid,甚至在其保留在客戶端但在服務器中刪除的會話失效之後,因此當用戶請求的過期jsessionid服務器知道會話無效,因此創建新的會話。

因此,註銷時失效非常重要。

HttpSession session = request.getSession(false); 
session.invalidate();  

即使您想要在註銷時清除客戶端當前會話的數據。使用下面的代碼。

Cookie[] cookies = request.getCookies(); 
    for (Cookie cookie : cookies) { 
     cookie.setMaxAge(0); 
     cookie.setValue(null); 
     cookie.setPath("/"); 
     response.addCookie(cookie); 
    }