Как отследить завершение / таймаут пользовательской сессии
В некоторых случаях нужно отслеживать когда пользователь покинул сайт/закрыл вкладку/браузер/вышло время сессии.
Для события истечение времени сессии все довольно просто. Знаю такие способы -
Объявляем листенер в web.xml
На стороне сервера можно принудительно удалять сессию
Для события истечение времени сессии все довольно просто. Знаю такие способы -
1. Листенер сессий
Определяется в web.xml или аннотацией @WebListener, класс реализует интерфейс javax.servlet.http.HttpSessionListener, там всего два метода - вызываются при создании и удалении сессии.
public class MySessionListener implements HttpSessionListener { static final Logger logger = Logger.getLogger(MySessionListener.class.getName()); @Override public void sessionCreated(HttpSessionEvent hse) { // do something... logger.info(">> Strat " + hse.getSession().getId()); } @Override public void sessionDestroyed(HttpSessionEvent hse) { // do something... logger.info(">>> End " + hse.getSession().getId()); } }
Объявляем листенер в web.xml
< listener> < listener-class>org.str.example.MySessionListener < display-name>Session Listener < / listener>2. Сессионно живыщие бины
@SessionBean, в которых определить метод @PreDestroy - он будет вызывать перед удалением сессии.
@SessionScoped @ManagedBean public class SessionListenerBean { @PreDestroy public void logSession() { // do something } }
Веб часть - при закрытии вкладки
Когда пользователь закрыл вкладку, сессия не обрывается на сервере,и будет висеть до таймаута. Нужно сообщать об уходе отдельно, js не может удалить сессию, но можно навесить экшен на закрытие таба, и отсылать что либо серверу. Например нажимать принудительно выход или дергать рест сервис. window.onbeforeunload - вызывается перед закрытием вкладки
<script type="text/javascript"> window.onbeforeunload = function () { // do something var buttonExit = document.getElementById("myLogoutButton"); buttonExit.click(); } </script>
На стороне сервера можно принудительно удалять сессию
((HttpSession) FacesContext.getCurrentInstance().getExternalContext() .getSession(false)).invalidate();
В этом случае так же будут дергаться вышеупомянутые методы из SessionBean и листенера
js событие при закрытии браузера
js и сессии
Листенер