Bom dia a todos…
Galera o seguinte, estou tentando finalizar uma seção aberta pela aplicação JSF, mas no momento em que o sistema finaliza a sessão, automaticamente ele chama o método para criar uma nova seção…
Eu não quero este comportamento, eu preciso que ele feche a aba do sistema…
o código que estou fazendo para finalizar a sessão é este:
if (session != null) {
session.invalidate();
return;
}
Valeu… obrigado !!!
eu faço assim: chamo a função logout atraves de um botao e mato a sessao e redireciono para a página que eu quero.
public String logout() {
//Redireciona o usuário para tela de login efetuando o logout.
String loginPage = "/redirecionamento.jsp";
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest) context.getRequest();
try {
context.redirect(request.getContextPath() + loginPage);
} catch (IOException e) {
logger.error("Erro ao tentar redirecionar para página solicitada ao efetuar Logout: " + e.toString());
}
HttpSession session = (HttpSession) context.getSession(false);
session.invalidate();
return "logout";
}
você tambem pode usar um FacesListener para verificar se a sessao é nula se for redireciona para a página que quiser.
no FacesConfig.xml:
<!--Filtro responsável por verificar se a sessão ainda está ativa-->
<lifecycle>
<phase-listener>caixa.sc.sicff.util.AutorizadorPhaseListener</phase-listener>
</lifecycle>
Codigo Java:
public class AutorizadorPhaseListener implements PhaseListener, Sicff {
public static final String loginPage = "/template.jsf";
private static final long serialVersionUID = 1L;
/**
* Método chamado sempre após a execução de uma determinada PHASE
* @param event - {@link PhaseEvent}
*/
public void afterPhase(PhaseEvent event) {
FacesContext fc = event.getFacesContext();
if (fc.getViewRoot().getViewId().equals(loginPage)) {
return;
}
NavigationHandler nav = fc.getApplication().getNavigationHandler();
nav.handleNavigation(fc, null, "login");
}
/**
** Método chamado sempre antes de se executar uma determinada PHASE
* @param event - {@link PhaseEvent}
*/
public void beforePhase(PhaseEvent event) {
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
HttpServletRequest request = (HttpServletRequest) context.getRequest();
if (!request.getRequestURL().toString().endsWith(loginPage) && (context.getSession(false) == null)) {
try {
context.redirect(request.getContextPath() + loginPage);
} catch (IOException e) {
logger.error("Erro ao tentar redirecionar para a página solicitada: " + e.toString());
}
}
}
/**
* Retorna o PhaseId da fase do ciclo de vida JSF.
* Neste caso indica que o PhaseListener será executado
* durante todas as fases do JSF
* @return - {@link PhaseId}
*/
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
Então, ele até finaliza a sessão, passa pelo ouvinte de sessão (sessionDestroyed), porém logo após executar o ouvinte de sessão, o sistema recria denovo e passa por todas as regras que estabeleci no sessionCreated.
O que eu preciso é inibir esta ação de criar nova sessão automaticamente…
Obrigado
Não sei se é realmente a melhor solução, mas resolvio o problema diminuindo o tempo de sessão inativa.
Codigo JSF
actionListener="#{MB.fechar}" oncomplet="window.close();"
Método fechar() do MB
session.setMaxInactiveInterval (2); //Tempo em segundos.