Problemas com gerenciamento de páginas e minha implementação de PhaseListener

Bom dia Gujianos :smiley:

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.

Primeiro de tudo, #ForeverAlone
rsrs
já encontrei a resolução do problema! :smiley:

é só bloquear o cache do navegador via Response

Segue o meu exemplo :smiley:

[code]public class AuthorizationListener implements PhaseListener {

public void afterPhase(PhaseEvent event) {
    FacesContext fc = event.getFacesContext();
    ExternalContext ec = fc.getExternalContext();
    HttpServletResponse response = (HttpServletResponse) ec.getResponse();
    // 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 usuarioLogado = (String) session.getAttribute("usuarioLogado");
    // 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") && usuarioLogado == null) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("/ged_quali_web/redireciona.html");
        } catch (IOException ex) {
            Logger.getLogger(AuthorizationListener.class.getName()).log(Level.SEVERE, null, ex);

        }
    }
    if (currentPage.contains("login") && usuarioLogado != null) {
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("/ged_quali_web/main.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(AuthorizationListener.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


    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");
}[/code]

Abraços!

obrigado amigo era exatamento o que eu estava preucurando.

Então,

Estou começando em Java+JSF, poderia me ajudar?

Estou começando um projeto e gostei muito das mudanças do JSF 2.0 e o visual com o PrimeFaces, mas não tenho muita pratica com o desenvolvimento web. Com base em exemplos e tutorias eu criei uma tela de login, porém enfrento os problemas que você citou com as ações do usuario, fechar o navegador, voltar ou avançar páginas no navegador, e vi nesse post que você resolveu esse problema, mas não entendi como se usa.

Você poderia me explicar o contexto e como se usa esssa classe?

Obrigado

Post antigo, mas acaba de me ajuda muito. Obrigado!