Probleminha com PhaseListener - JSF2

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 http://hslife.com.br/2010/12/18/controle-de-acesso-com-phaselistener/#codesyntax_8
e achei bem simples.
Vejam esses trechos de código que eu fiz para minha aplicação a partir do tuto:

PhaseListener

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

ControladorAcessoMB:

[code]@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[/code]

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

Tá de pegadinha ?

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…

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

[code]

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

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 :wink:

Boa sorte!
Qualquer duvida volta ai!