我在數據庫中存儲會話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)
我會說你的註銷已經損壞了。或者你的登錄。或兩者。 – 2012-08-09 15:43:30
我不這麼認爲,Dave.Login只是一個html頁面,所有的東西都在這裏的servlet中處理。 – anujin 2012-08-09 15:44:55
真的嗎?嗯。因爲通常在註銷時你會使當前會話無效(或者如果你沒有註銷,或者你應該運行註銷代碼,則在登錄時)。但會話ID並不是真正的門控問題 - 會話中*是最重要的事情。如果會話或數據庫中仍有舊數據,則登錄或註銷都會中斷(或兩者都有)。 – 2012-08-09 15:49:44