[Resolvido]Problemas PhaseListener

4 respostas
EHS

Bom galera, fiz a área administrativa do sistema mas está com um problema. Depois que eu me logo no sistema ele não me deixa
navegar pelas páginas que necessitam de usuário/senha, tipo assim, me logo no sistema e então vou para a página de cadastro de produto
mas então se a partir daí eu quero ir para a página de cadastro de usuário o sistema pede para eu me logar novamente, então como eu resolvo isso ??
Fiz isso através do PhaseListener, abaixo minhas classes.

AuthorizationListener.
package utils;

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;
import model.Usuario;

/**
 *
 * @author Egon Henrique
 */
public class AuthorizationListener implements PhaseListener {

    private static final long serialVersionUID = 1L;

    @Override
    public void afterPhase(PhaseEvent event) {
        //dquirindo FacesContext
        FacesContext facesContext = event.getFacesContext();
        //Armazenando página que fez requisição
        String currentPage = facesContext.getViewRoot().getViewId();
        //Verifica se é página de login
        boolean isLoginPage = (currentPage.lastIndexOf("index.xhtml") > -1) ||
                (currentPage.lastIndexOf("contato.xhtml") > -1) || (currentPage.lastIndexOf("queijos.xhtml") > -1);
        //Adquirindo a sessão(é a mesma onde deverá guardar o usuário no nível de sessão
        //com o descritor currentUser
        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
        //Recuperando valor da sessão
        Usuario user = (Usuario) session.getAttribute("currentUser");
        //Se não ta logado, redireciona para  lógica que(navigation rule) atende a loginPage
        if(!isLoginPage && user == null) {
            NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
            nh.handleNavigation(facesContext, null, "loginPage");
        }
        }
        
    //}

    @Override
    public void beforePhase(PhaseEvent event) {
         
    }


    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

}
usuarioController.
package controller;

import DAO.UsuarioDAO;
import javax.faces.component.UIData;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import model.Usuario;

/**
 *
 * @author Egon Henrique
 */
public class UsuarioController {

    private Usuario usuario;
    private String senha;
    private String login;
    private Usuario usuarios;
    private UIData tabela;
    private UsuarioDAO usuarioDAO;

    public UIData getTabela() {
        return tabela;
    }

    public void setTabela(UIData tabela) {
        this.tabela = tabela;
    }

    public Usuario getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(Usuario usuarios) {
        this.usuarios = usuarios;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public UsuarioController() {
        usuario = new Usuario();
        preencherTabela();
    }

    public String Salvar() throws Exception {
        usuarioDAO = new UsuarioDAO();
        //this.produto.setFoto(foto);
        usuarioDAO.inserir(usuario);
        usuario = new Usuario();
        preencherTabela();
        return null;
    }

    public void preencherTabela() {
        usuarioDAO = new UsuarioDAO();
        usuarios = usuarioDAO.getUsuario();
    }

    public void excluir(Usuario usuario) {
        usuario =  (Usuario) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar());
        usuarioDAO = new UsuarioDAO();
        usuarioDAO.delete(usuario);
        preencherTabela();
    }

    public String doLogin() {

        FacesContext fc = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);

        usuarioDAO = new UsuarioDAO();
        usuario = usuarioDAO.getUsuario();

        if(login.equalsIgnoreCase(usuario.getLogin()) && senha.equalsIgnoreCase(usuario.getSenha())) {
            usuario = new Usuario();
            usuario.setLogin(login);
            usuario.setSenha(senha);
            session.setAttribute("usuario", usuario);
            login = null;
            senha = null;
            return "cadastroProduto.xhtml";
        } else {
            return "login.xhtml";
        }
    }
Faces-Config.
<navigation-rule>
        <from-view-id>page/cadastroProduto.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>loginPage</from-outcome>
            <to-view-id>page/login.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>

    <navigation-rule>
        <from-view-id>page/cadastroOvelha.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>loginPage</from-outcome>
            <to-view-id>page/login.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>

    <navigation-rule>
        <from-view-id>page/cadastroUsuario.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>loginPage</from-outcome>
            <to-view-id>page/login.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>

    <lifecycle>
        <phase-listener>utils.AuthorizationListener</phase-listener>
    </lifecycle>
</faces-config>

4 Respostas

carlos_hen

kara… no usuarioController vc setou o usuario na session no atributo “usuario”…

session.setAttribute("usuario", usuario);

e no AuthorizationListener vc está tentando achar esse kara no atributo “currentUser”…

Usuario user = (Usuario) session.getAttribute("currentUser");

vai vir nulo mesmo…

o certo é:

Usuario user = (Usuario) session.getAttribute("usuario");

Falows.

EHS

To no trabalho agora, testo qdo chego em casa, mas então pelo que entendi é assim:
é nessa linha que eu digo qual usuário está logado no sistema ??

session.setAttribute("usuario", usuario);

e daí no AuthorizationListener eu pego o usuário através dessa linha ??

Usuario user = (Usuario) session.getAttribute("usuario");

seria essa a lógica ??

carlos_hen

exato.

EHS

Vlw aí carlos_hen, agora funciona direitinho.
Então o código ficou assim

AuthorizationListener.java
public class AuthorizationListener implements PhaseListener {  
  
    private static final long serialVersionUID = 1L;  
  
    @Override  
    public void afterPhase(PhaseEvent event) {  
        //dquirindo FacesContext  
        FacesContext facesContext = event.getFacesContext();  
        //Armazenando página que fez requisição  
        String currentPage = facesContext.getViewRoot().getViewId();  
        //Verifica se é página de login  
        boolean isLoginPage = (currentPage.lastIndexOf("index.xhtml") > -1) ||  
                (currentPage.lastIndexOf("contato.xhtml") > -1) || (currentPage.lastIndexOf("queijos.xhtml") > -1);  
        //Adquirindo a sessão(é a mesma onde deverá guardar o usuário no nível de sessão  
        //com o descritor currentUser  
        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);  
        //Recuperando valor da sessão  
        Usuario user = (Usuario) session.getAttribute("usuario");  
        //Se não ta logado, redireciona para  lógica que(navigation rule) atende a loginPage  
        if(!isLoginPage && user == null) {  
            NavigationHandler nh = facesContext.getApplication().getNavigationHandler();  
            nh.handleNavigation(facesContext, null, "loginPage");  
        }  
        }  
          
    //}  
  
    @Override  
    public void beforePhase(PhaseEvent event) {  
           
    }  
  
  
    @Override  
    public PhaseId getPhaseId() {  
        return PhaseId.RESTORE_VIEW;  
    }  
  
}
UsuarioController.java
public String doLogin() {  
  
        FacesContext fc = FacesContext.getCurrentInstance();  
        HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);  
  
        usuarioDAO = new UsuarioDAO();  
        usuario = usuarioDAO.getUsuario();  
  
        if(login.equalsIgnoreCase(usuario.getLogin()) && senha.equalsIgnoreCase(usuario.getSenha())) {  
            usuario = new Usuario();  
            usuario.setLogin(login);  
            usuario.setSenha(senha);  
            session.setAttribute("usuario", usuario);  
            login = null;  
            senha = null;  
            return "cadastroProduto.xhtml";  
        } else {  
            return "login.xhtml";  
        }  
    }
Criado 25 de março de 2011
Ultima resposta 25 de mar. de 2011
Respostas 4
Participantes 2