Estou desenvolvendo uma aplicação Web utilizando JSF+Richfaces+Hibernate. No faces-config, nas navegações utilizo forward ou invésdo redirect.
Implementei um PhaseListener para fazer a autenticação e autorização do usuário, segue o código:
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;
import javax.servlet.http.HttpSession;
public class Autorizador implements PhaseListener {
public void beforePhase(PhaseEvent event) {
/*FacesContext fc = event.getFacesContext();
System.out.println(event.getPhaseId());
System.out.println(fc.getViewRoot().getViewId());*/
FacesContext contexto = event.getFacesContext();
String paginaAtual = contexto.getViewRoot().getViewId();
boolean paginaLogin = (paginaAtual.lastIndexOf("/servidor/localizarServidor.jsp") > -1);
HttpSession sessao = (HttpSession)contexto.getExternalContext().getSession(true);
Object usuario = sessao.getAttribute("usuario");
if (!paginaLogin && usuario == null) {
NavigationHandler navegacao = contexto.getApplication().getNavigationHandler();
navegacao.handleNavigation(contexto, null, "acesso");
}
}
public void afterPhase(PhaseEvent event) {
/*FacesContext fc = event.getFacesContext();
System.out.println(event.getPhaseId());
System.out.println(fc.getViewRoot().getViewId());*/
}
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}
Implementei também um outro PhaseListener para fazer o controle de cache, segue o código:
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletResponse;
public class ControlaCache implements PhaseListener {
public void beforePhase(PhaseEvent event) {
FacesContext contexto = event.getFacesContext();
HttpServletResponse response = (HttpServletResponse)contexto.getExternalContext().getResponse();
response.setHeader("Expires", "-1");
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidade, proxy-revalidade, private, post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
}
public void afterPhase(PhaseEvent event) {
}
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}
Tenho uma tela de login.
Passando pela tela de login, tenho umas tela com abas(Dados do servidor, endereço, contato, dependente, instituidor(caso pensionista)).
Tenho uma tela final aonde o usuário confirma o cadastro. Nessa tela tem um: a4j:commandButton Confirmar que executa um action de um back bean, inserindo os dados, e no onclick abro um rich:modalPanel. Nesse rich:modalPanel tem um h:commandButton Fechar que executa um action de um back bean, pegando a sessao e invalidando-a, e no onclick fecho o rich:modalPanel e automaticamente volta para a tela de login. Até aqui tudo bem.
Agora vem o problema: quando clico no botão voltar do navegador, a tela final(confirmação do cadastro) é carregada, sendo que já invalidei a sessão.
Como resolver esse problema?