2012-08-09 4 views
0

log in 시간에 데이터베이스에 세션 ID를 저장하려고합니다. 내가 직면 한 문제는 다른 사용자가 첫 번째 세션 이후에 로그인하면 동일한 세션이 DB에 입력되고 welcome username은 여전히 ​​동일한 시스템에 처음 로그인 한 사용자의 이름을 반영한다는 것입니다. 사용자가 로그인 할 때마다 새 세션 ID를 만들고 싶지만 어떻게 든 내 코드가 작동하지 않습니다.Java Servlet에서 강제로 새 세션을 만드는 방법

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

참고 : 위 코드는 사용자가 로그인 버튼을 클릭하여 서블릿에 포함 된 경우에 호출됩니다.

세션 ID는 이전 세션 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(); 
     } 

는 아래의 예외를 얻을 - 새로운 세션에 session 변수를 설정

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

로그 아웃이 깨졌습니다. 또는 귀하의 로그인. 아니면 둘다. –

+0

나는 그렇게 생각하지 않는다. Dave.Login은 html 페이지 일 뿐이며 모든 것은 여기 서블릿에서 처리된다. – anujin

+0

정말요? 흠. 일반적으로 로그 아웃 할 때 현재 세션을 무효화하기 때문에 (또는 로그 아웃하지 않았거나 로그 아웃 코드 만 실행해야하는 경우 로그인 할 때). 하지만 세션 ID는 실제로 게이팅 이슈가 아닙니다. 세션에서 * 무엇이 가장 중요한 것입니까? 세션이나 데이터베이스에 오래된 데이터가 남아있는 경우 로그인 또는 로그 아웃이 손상되었습니다. –

답변

1

: 당신은 이전 작업을 시도하고를, 하나를 무효화.

+0

어떻게 할 수 있습니까? 너의 생각은 어떠니? – anujin

+0

Dave에게 감사드립니다. 당신의 대답은 나를 도왔고, 세부 사항은 - [killsession] (http://stackoverflow.com/questions/5404907/kill-user-session)에서 발견되었습니다. – anujin

+0

@anujin 다행스럽게도 다행스럽게도 변수를 새로운 가치로 설정하면 연구가 필요하지 않을까요? –

0

먼저 로그 아웃 중에 세션을 무효화해야합니다. 그러면 서버에서 세션이 삭제되고 해당 데이터가 통합됩니다.

사실 세션 ID는 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); 
    } 
관련 문제