2013-03-05 2 views
3

Я создаю java-карточную игру, используя сервлеты. мне нужно знать, когда пользователь не отвечает на 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

Спасибо, но в этом и я только добираюсь до sessionDestroyed() после обновления в браузере. Или я делаю что-то неправильно? – YotamB

+0

Вам не нужно ничего делать в отношении таймаута сеанса, например, манипулирования браузером, ваш контейнер сервлетов будет обрабатывать эту ситуацию для вас. Обратите внимание, что сеанс не будет собран * точно * после истечения периода ожидания. Контейнер сервлета проверяет сеанс, который тайминг * время от времени *, и после нахождения сеанса, который имеет право на уничтожение, запускает метод слушателя и разрушает сеанс. – skuntsel

0

Я кончался используя HttpSessionListener и обновляя интервал больше, чем setMaxInactiveInterval.

Так что, если использованный не сделал ничего за 30 секунд в следующем обновлении после 40 секунд, я добираюсь до sessionDestroyed().

Также важно, чтобы вам нужно было создать новый ServletContext для доступа к ServletContext.

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

Спасибо!

+0

Итак, вы решили проблему? –

+0

Рассмотрите возможность открытия двумя вкладками браузера на расстоянии 20 секунд - это может привести к тому, что они никогда не будут выходить из системы, если вы не будете осторожны. –

0

Альтернативой угадыванию на основе интервала ожидания является установка атрибута в сеансе при выходе пользователя из системы. Например, если вы можете поставить что-то вроде следующей в методе, который обрабатывает пользователь вызвал завершения сеанса:

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

, то вы можете иметь следующее в своем классе HttpSessionListener:

@Override 
public void sessionDestroyed(HttpSessionEvent event) { 
    HttpSession session = event.getSession(); 
    if (session.getAttribute("logout") == null) { 
     // it's a timeout 
    } 
} 
Смежные вопросы