About

6 июн. 2016 г.

Как отследить завершение / таймаут пользовательской сессии


В некоторых случаях нужно отслеживать когда пользователь покинул сайт/закрыл вкладку/браузер/вышло время сессии.


Для события истечение времени сессии все довольно просто. Знаю такие способы -

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 и сессии
Листенер