2012-08-09 44 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); 
    }