Bom dia Gujianos
Primeiramente, feliz ano novo para todos!
Agora de volta ao batente, vamos ao que interessa.
Como já devo ter postado em outros tópicos, comecei uma migração de um sistema para Web, e agora comecei ver a parte de segurança e manipulação de sessão.
Consegui criar uma classe que verifique em cada requisição (não sei se é o termo mais adequado) se há algum usuário logado no meu sistema. Por enquanto, não estou dando atenção para níveis de acesso, o que me interessa agora é corrigir um problema!
Este problema é: sempre que estou logado no sistema, e encerro a minha sessão, ele redireciona para a página de login, porém se eu apertar “Voltar” no navegador (ou backspace) ele retorna para a página anterior! Gostaria de saber como tratar essa situação, pois podemos esperar tudo de um usuário!
Os outros problemas como o usuario tentar acessar uma página sem ter logado, digitando a URL diretamente eu já tratei, e também consegui encerrar a sessão via botão ou fechando o navegador.
Se alguém se interessar, segue o meu código comentado. Coloquei também os imports que eu fiz, pois temos algumas classes com mesmos nomes porém de pacotes diferentes. (:
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
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 AuthorizationListener implements PhaseListener {
public void afterPhase(PhaseEvent event) {
FacesContext fc = event.getFacesContext();
// objeto de FacesContext recebe a contexto da requisição acessada nessa Phase.
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
// Esta linha acima pega a sessão atual do FacesContext, e se ela nao existir ele cria uma
String usuarioOn = (String) session.getAttribute("usuarioOn");
// Este atributo é setado na sessão sempre que o usuário fazer a autenticação
String currentPage = fc.getViewRoot().getViewId();
// Esta String recebe a View que está sendo chamada na requisição desta Phase
// A partir daqui é muito básico e intuitivo.
if (!currentPage.contains("Login") && usuarioOn == null) {
try {
FacesContext.getCurrentInstance().getExternalContext().redirect("/GED_PROJ_Web_RestauraDocs/redirect.xhtml");
} catch (IOException ex) {
Logger.getLogger(AuthorizationListener.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (currentPage.contains("Login") && usuarioOn != null) {
try {
FacesContext.getCurrentInstance().getExternalContext().redirect("/GED_PROJ_Web_RestauraDocs/MainPage.faces");
} catch (IOException ex) {
Logger.getLogger(AuthorizationListener.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void beforePhase(PhaseEvent event) {
}
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
Abraços, agradeço quem puder ajudar este novato, ou se interessar pelo topico.