Bom dia galera, eu fiz um código aqui para encerrar a sessão do usuário. Espero que ajude.
No jsp adicionei os seguintes eventos no body:
<html xmlns:p="http://primefaces.org/ui">
<h:body onunload="limparSessao()" onload="ativarSessao()">
e essa parte para criar funções JS que executem métodos do meu bean
<p:remoteCommand name="limparSessao" immediate="true" action="#{loginMB.limparSessao}"/>
<p:remoteCommand name="ativarSessao" immediate="true" action="#{loginMB.ativarSessao}"/>
No meu ManegedBean ( loginMB): public void limparSessao(){
try {
Thread.sleep(5*1000);// Aguardar 5 segundos para verificar se é para sair da sessão
Boolean flag = (Boolean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("flagSair");
if(flag == null || flag){
// Encerrar a sessão.
System.out.println(">>>>>>>>>> Sessão Encerrada!!! <<<<<<<<<<<<");
final HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(Boolean.TRUE);
session.invalidate();
} else {
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("flagSair", true);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void ativarSessao(){
// Se for o primeiro acesso, setar que pode deslogar ao sair da pagina (Default).
if(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("flagSair") == null){
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("flagSair", true);
} else {
// Setar que não pode deslogar ao sair da pagina (Default).
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("flagSair", false);
}
}
Dessa forma se a janela for fechada (apertando no 'X', com alt+f4 e etc...) e não atualizada a sessão será encerrada.