Olá pessoal, boa noite.
Estou com um problema na minha classe que implementa o PhaseListener, onde após a autenticação no sistema
e deixar o mesmo sem utilização durante o tempo definido no web.xml, recebo a mensagem que a view não pôde ser restaurada. Contudo era para o sistema
me redirecionar para a página de login, ou uma outra página especificada, informando que a sessão expirou para entrar com os dados do usuário novamente.
Tenho a seguinte classe abaixo:
package br.com.notaroberto.control;
import br.com.notaroberto.model.Usuario;
import javax.el.ELResolver;
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
/**
*
* @author Lessandro
*/
public class FaseListener implements PhaseListener {
private static final long serialVersionUID = 1L;
private static final String paginaLogin = "login.xhtml";
private static final String paginaLoginRedirecionada = "/login?faces-redirect=true";
private static final String paginaIndexRedirecionada = "/index?faces-redirect=true";
private boolean sessaoExpirou, ehPaginaLogin;
public FaseListener() {
}
@Override
public void afterPhase(PhaseEvent event) {
if (event.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
try {
FacesContext fc = event.getFacesContext();
if (fc.getViewRoot() == null) {
sessaoExpirou = true;
} else {
ehPaginaLogin = fc.getViewRoot().getViewId().contains(paginaLogin);
}
ELResolver elr = fc.getApplication().getELResolver();
Usuario usuarioAutenticado = (Usuario) elr.getValue(fc.getELContext(), null, "usuarioAutenticado");
NavigationHandler nav = fc.getApplication().getNavigationHandler();
if (!sessaoExpirou && !ehPaginaLogin && usuarioAutenticado == null) {
nav.handleNavigation(fc, null, paginaLoginRedirecionada);
} else if (!sessaoExpirou && ehPaginaLogin && usuarioAutenticado != null) {
nav.handleNavigation(fc, null, paginaIndexRedirecionada);
}
} catch (Exception e) {
System.out.println("Erro: " + e);
}
}
System.out.println("AFTER: " + event.getPhaseId());
}
@Override
public void beforePhase(PhaseEvent event) {
/*if (event.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
try {
FacesContext fc = event.getFacesContext();
if (fc.getViewRoot() == null) {
sessaoExpirou = true;
}
if (sessaoExpirou) {
NavigationHandler nav = fc.getApplication().getNavigationHandler();
nav.handleNavigation(fc, null, paginaLoginRedirecionada);
}
} catch (Exception e) {
System.out.println("Erro: " + e);
}
}*/
System.out.println("BEFORE: " + event.getPhaseId());
}
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
Se eu descomentar o código da fase beforePhase, o sistema entra num loop infinito, devido à fase de visão o viewRoot() do contexto da aplicação estar sempre nulo,
e devido á isso ficar chamando a página de login.xhtml.
Alguém sabe como implementar algo que resolvesse essa questão, como descrita anteriormente?
Já segui diversos tutoriais que basicamente possuem o mesmo código que eu postei, porém essa questão de sessão expirada não é tratada, apenas autenticação do
usuário recuperando o escopo trazido do managedBean que realiza o processo de carregar o usuário da base.
Agradeço desde já pela atenção,
Att,
Lessandro