我在数据库中存储会话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