Probleminha com PhaseListener - JSF2

3 respostas
R

Salve galera, tudo beleza?
Galera, TCC chegando aí e to com um probleminha:
tenho uma aplicação em que preciso fazer autenticação de usuário e não conseguia.
Comecei a ver um pouco sobre o PhaseListener e resolvi utilizá-lo porque é simples e prático.
Analisando uns tutoriais na net encontrei esse, encontrei esse [url]http://hslife.com.br/2010/12/18/controle-de-acesso-com-phaselistener/#codesyntax_8[/url]
e achei bem simples.
Vejam esses trechos de código que eu fiz para minha aplicação a partir do tuto:

PhaseListener
public class ControladorPhaseListener implements PhaseListener {
    
    @Override
    public void afterPhase(PhaseEvent evento) {
        //Obtem o contexto atual
        FacesContext contexto = evento.getFacesContext();
        //Obtem a pagina que atualmente esta interagindo com o ciclo
        String paginaAtual = contexto.getViewRoot().getViewId();
        //Se a pagina for a de usuario, seta a variavel como true
        boolean isPaginaLogin = paginaAtual.lastIndexOf("faces/login.xhtml") > -1;
        //Obtem a sessao atual
        HttpSession sessao = (HttpSession) contexto.getExternalContext().getSession(false);
        //Resgata o nome do usuario logado
        String usuario = (String) sessao.getAttribute("loginUsuario");
        //Verifica se o usuario esta logado e se nao esta na pagina de usuario
        if (!isPaginaLogin || usuario == null) {
            //Redireciona para a pagina de usuario
            NavigationHandler navigationHandler = contexto.getApplication().getNavigationHandler();
            navigationHandler.handleNavigation(contexto, null, "sair");
        } else if (isPaginaLogin && usuario != null) {
            //Se o usuario tentar acessar a pagina de usuario, ele e direcionado para a pagina inicial
            NavigationHandler navigationHandler = contexto.getApplication().getNavigationHandler();
            navigationHandler.handleNavigation(contexto, null, "sucesso");
        }      
    }
    
    @Override
    public void beforePhase(PhaseEvent evento) {
        
    }
    
    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }
ControladorAcessoMB:
@ManagedBean
@RequestScoped
public class ControladorAcessoMB {

    private String nomeUsuario;
    private String loginUsuario;
    private String senhaUsuario;
    
    public ControladorAcessoMB() {
        FacesContext contexto = FacesContext.getCurrentInstance();
        HttpSession sessao = (HttpSession) contexto.getExternalContext().getSession(false);
        nomeUsuario = (String) sessao.getAttribute("nomeUsuario");
        loginUsuario = (String) sessao.getAttribute("loginUsuario");
        senhaUsuario = (String) sessao.getAttribute("senhaUsuario");
    }

public String obterSessao() {
        return "sessao";
    }
    
    public String validarAcesso() {
        FacesContext contexto = FacesContext.getCurrentInstance();
        HttpSession sessao = (HttpSession) contexto.getExternalContext().getSession(false);
        sessao.setAttribute("nomeUsuario", nomeUsuario);
        sessao.setAttribute("loginUsuario", loginUsuario);
        sessao.setAttribute("senhaUsuario", senhaUsuario);
        return "sucesso";
    }
    
    public String sair() {
        FacesContext contexto = FacesContext.getCurrentInstance();
        HttpSession sessao = (HttpSession) contexto.getExternalContext().getSession(false);
        sessao.invalidate();
        nomeUsuario = null;
        loginUsuario = null;
        senhaUsuario = null;
        return "sair";
    }

//getters e setters
login.xhtml:
<h:form id='formulario'>
            <h:panelGrid columns='2'>
                <p:outputLabel value="Login: " />
                <p:inputText id='txtLogin'
                             value="#{controladorAcessoMB.loginUsuario}" />
                <p:outputLabel value='Senha: ' />
                <p:password id='txtSenha'
                            value='#{controladorAcessoMB.senhaUsuario}' /> 
                <p:commandButton value="Entrar"
                                 icon='ui-icon-check'
                                 action="#{controladorAcessoMB.obterSessao()}">
                </p:commandButton>
            </h:panelGrid>
        </h:form>
Preciso de duas coisas: - Podem me explicar o que os métodos validarAcesso() e sair() da classe ControladoraAcessoMB faz? Para que se eu for interrogado eu possa explicar rsrs - Porque quando executo a aplicação o log exibe um 'java.lang.NullPointerException' para essa linha:
nomeUsuario = (String) sessao.getAttribute("nomeUsuario");
?

Obrigado galera
[]'s

3 Respostas

D

Tá de pegadinha ?

R

Não, não estou de pegadinha diego_pereira, você está?
O que acontece é que muitos de nós (assim como eu) não temos experiência ainda com aplicações Web, e enfrentamos dificuldades.
Eu sei que ele está dando esse erro porque a variável está recebendo null.
O que eu gostaria de saber são as possíveis soluções para meu problema, e não ser ironizado.

Obrigado…

D

Cara, como tu disse que tinha montado os métodos, logo pensei que tu sabia o que estava fazendo...

//Faz login no sistema
     public String validarAcesso() {  
        // Pega a instancia atual
        FacesContext contexto = FacesContext.getCurrentInstance();  

        // Quando tu coloca false no getSession(false) ele vai fazer o seguinte:
        //  Se tiver  uma sessao ativa, então retorna ela, senão retorna null.
        // Se tu coloca true:
        // Se tiver sessao ativa retorna ela, senao cria uma nova sessao. Nunca vai retorna null
        HttpSession sessao = (HttpSession) contexto.getExternalContext().getSession(false);  

        
        // Se a sessao tiver nula, logo ele não vai conseguir setar esses parametros.
        // Coloca o nome do usuario
        sessao.setAttribute("nomeUsuario", nomeUsuario);  
        // Coloca o nome do login
        sessao.setAttribute("loginUsuario", loginUsuario);  
        // Coloca o nome do senha
        sessao.setAttribute("senhaUsuario", senhaUsuario);  


        // Retorna a pagina que está mapeada
        return "sucesso";  
    }  
      
    // Faz logout
    public String sair() {  
      
        // Pega a instancia atual
        FacesContext contexto = FacesContext.getCurrentInstance();  

        // Quando tu coloca false no getSession(false) ele vai fazer o seguinte:
        //  Se tiver  uma sessao ativa, então retorna ela, senão retorna null.
        // Se tu coloca true:
        // Se tiver sessao ativa retorna ela, senao cria uma nova sessao. Nunca vai retorna null
        HttpSession sessao = (HttpSession) contexto.getExternalContext().getSession(false);  
        
        // tem que botar num if isso aqui pra que caso a sessao ainda esteja ativa entao invalida ela, senao segue o barco.
        sessao.invalidate();  

        // Anula tudo
        nomeUsuario = null;  
        loginUsuario = null;  
        senhaUsuario = null;  

        // Volta pra pagina mapeada com sair.
        return "sair";  
    }

A provavel resposta para tua segunda pergunta:

Ali no construtor tem isso.
HttpSession sessao = (HttpSession) contexto.getExternalContext().getSession(false);

Ele pode tá trazendo a sessão null, logo estara nulo esses atributos.

Existem outras formas melhores de fazer login.
Tem que pesquisar... dá mesma forma que tu vai ser interrogado, deverá interrogar o google para entender o funcionamento das coisas.

A melhor forma de aprender é praticando, muito..
Continua pesquisando e perguntando... pra isso existe o forum ;)

Boa sorte!
Qualquer duvida volta ai!

Criado 19 de abril de 2013
Ultima resposta 19 de abr. de 2013
Respostas 3
Participantes 2