2013-03-05 4 views
3

저는 서블릿을 사용하여 자바 웹 보드 게임을 만들고 있습니다. 사용자가 30 secundes에 대해 응답하지 않을 때 내가 알 필요가 , 나는 세션 시간 초과를 인식합니다.

session.setMaxInactiveInterval(30); 

을 사용하고하지만 한 번 시간이 그래서 확실히이 플레이어를 만들 수 있습니다 종료 서버 측에서 알아야합니다.

플레이어가 돌아와서 무언가를하려고하면 시간 제한을 받게되고 서버에서 볼 수 있습니다.

세션이 제한 시간을 초과하면 서블릿에서 어떻게 알 수 있습니까?!

감사합니다.

답변

13

HttpSessionListener 인터페이스를 구현해야합니다. 세션이 생성되거나 파괴되면 알림 이벤트를 수신합니다. 특히, 그 메소드 sessionDestroyed(HttpSessionEvent se)은, 세션이 파기되었을 때에 불려갑니다. 이것은 타임 아웃 기간의 종료 후/세션이 무효가되어 발생합니다. 세션에 저장된 정보를 HttpSessionEvent#getSession() 통화를 통해 얻고 나중에 세션에서 필요한 모든 조치를 취할 수 있습니다. 또한, web.xml에서 세션 리스너를 등록해야합니다 :

<listener> 
    <listener-class>FQN of your sessin listener implementation</listener-class> 
</listener> 

당신이 궁극적으로 무효 당신이 당신의 리스너에 다음 줄을 사용할 수있는 세션 시간 제한을 구별하려면 : 나는 결국

long now = new java.util.Date().getTime(); 
boolean timeout = (now - session.getLastAccessedTime()) >= ((long)session.getMaxInactiveInterval() * 1000L); 
+0

감사합니다 : 당신은 당신의 HttpSessionListener 클래스에 다음과 같은 수 있습니다

httpServletRequest.getSession().setAttribute("logout", true); // invalidate the principal httpServletRequest.logout(); // invalidate the session httpServletRequest.getSession().invalidate(); 

: 당신이 좋아하는 무언가를 넣을 수 있습니다 예를 들어, 사용자가 로그 아웃 트리거 처리하는 방법으로 다음과 같은 또한 브라우저에서 새로 고침을 한 후 sessionDestroyed()에만 에 도착합니다. 내가 잘못하고있는 것이 있습니까? – YotamB

+0

브라우저를 조작하는 것과 같이 세션 시간 초과와 관련하여 아무 것도 할 필요가 없으며 서블릿 컨테이너가 해당 상황을 처리합니다. 시간 제한 기간이 다 된 후에는 해당 세션이 정확하게 수집되지 않을 것이라고 생각합니다. 서블릿 컨테이너는 모든 *, *를 시간 초과 한 세션을 확인하고 파기에 적합한 세션을 찾으면 리스너 메서드를 실행하고 세션을 삭제합니다. – skuntsel

0

HttpSessionListener를 사용하고 setMaxInactiveInterval보다 큰 간격으로 새로 고침합니다.

그래서 40 초 후에 다음 새로 고침에서 30 초 동안 아무것도하지 않으면 나는 sessionDestroyed()에 도착합니다.

또한 ServletContext를 얻기 위해 새 ServletContext를 만들어야하는 것이 중요합니다.

ServletContext servletContext=se.getSession().getServletContext(); 

고마워요!

+0

그래서 문제가 해결 되었습니까? –

+0

사용자가 두 개의 브라우저 탭을 20 초 간격으로 열어 놓는 경우를 생각해보십시오. 조심하지 않으면이 정렬로 인해 결코 로그 아웃되지 않을 수 있습니다. –

0

유휴 간격에 따라 추측하는 대신 사용자가 로그 아웃을 트리거 할 때 세션에 속성을 설정할 수 있습니다. 하지만이에,

@Override 
public void sessionDestroyed(HttpSessionEvent event) { 
    HttpSession session = event.getSession(); 
    if (session.getAttribute("logout") == null) { 
     // it's a timeout 
    } 
} 
관련 문제