Login aplicação JSF - [Resolvido]

63 respostas
cleiton_herrmann

Olá a todos, eu sei q vcs vão querer me bater por criar mais um tópico desses, mas o fato é q eu já li vários tópicos, tutoriais, e ainda não consegui entender, ou melhor, até consegui entender vários deles, mas não sei se é exatamente o q eu procurava, então acabei não conseguindo implementar minha idéia...

Bom, eu terei mais páginas no site, mas por enquanto tenho a index.xhtml e a enviarPromocoesCliente.xhtml, eu ja implementei várias coisas, mas to apanhando nesse login...

A idéia é a seguinte, a pagina inicial, qualquer pessoa podera acessar, é uma pagina que por hora vai exibir um catalogo de promoções do mês ou uma lista de produtos que o usuario pesquisou através de filtros disponíveis... Já a pagina enviarPromocoesCliente.xhtml, somente quem fizer login poderá acessar... Abaixo vou relacionar o que eu já fiz, e o que eu nao sei fazer:

Parte que interessa referente ao login, na index.xhtml
<p:outputPanel>
    <h:outputText value="Nome:"/>
    <p:inputText value="#{mBUsuarioLogado.nome}" /> 
    <h:outputText value="Senha:" />
    <p:password value="#{mBUsuarioLogado.senha}" feedback="false" minLength="3"/>
    <p:commandButton value="Logar"
                     action="#{mBUsuarioLogado.login()}" 
                     update="messages,pgLogin"
                     style="font-family: Tahoma;font-size: 10px"/>
</p:outputPanel>
Abaixo o MB que verifica o usuario e mantém um objeto usuarioLogado com o carinha que logou
@ManagedBean
@SessionScoped
public class MBUsuarioLogado {

    private DAO dao = DAO.getInstance();
    private HibernateUtil hu = new HibernateUtil();
    
    private List<Usuarios> usuarios = new ArrayList<Usuarios>();
    private Usuarios usuarioLogado;
    
    private String nome;
    private String senha;
    
   //construtor, sets e gets
    
    public void login() {
        boolean nomeOk = false;
        boolean senhaOk = false;
        
        usuarioLogado = null;
        usuarios.clear();
        
        Criteria c = hu.getCriteria(Usuarios.class);
        usuarios = dao.listarCriteria(c);
        
        for (Usuarios u : usuarios) {
            if (u.getNome().equals(nome)) {
                nomeOk = true;
                if (u.getSenha().equals(senha)) {
                    senhaOk = true;
                    usuarioLogado = u;
                }
                break;
            }
        }
        
        if (!nomeOk) {
            FacesMessage error = new FacesMessage("Falhou", "Nome incorreto !");
            FacesContext.getCurrentInstance().addMessage(null, error);
        }
        if (!senhaOk) {
            FacesMessage error = new FacesMessage("Falhou", "Senha incorreta !");
            FacesContext.getCurrentInstance().addMessage(null, error);
        }
        if (nomeOk && senhaOk) {
            FacesMessage msg = new FacesMessage("Login OK", usuarioLogado.getNome());
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
        
        nome = "";
        senha = "";
    }
    
    public void logout() {
        usuarioLogado = null;
    }
}
E agora ? eu nao sei continuar daqui... O que eu tenho q fazer para que, somente quando alguem tente acessar a pagina enviarPromocoesCliente.xhtml, seja verificado se existe um usuario logado ?

Desculpe a nubice ae pessoal, é q tenho pouca experiencia na web, e to apanhando há 3 dias desse login... hahaha

Desde já grato ! t+

63 Respostas

jv.nicocelli

Bom dia,

Da uma estudada sobre JAAS, creio que será util.

Tem um artigo aqui no GUJ sobre o assunto… http://www.guj.com.br/articles/184

cleiton_herrmann

eu ja tinha olhado rapido JAAS, vou dedicar mais tempo agora pra ele, qq coisa volto a postar ai, obrigado t+

finotti

Minha sugestão é utilizar um framework especializado em autenticação/autorização.
O JAAS citado anteriormente é um deles.
Aqui tem um exemplo usando JSF + Spring Security

R

Creio que vc deve fazer o contrário: ao invés de pegar todos os usuarios do BD e comparar com o usuario do MB,vc deve fazer um ‘find’ no banco com os dados que vieram da tela.

Sobre o login,eu faço com Filter e fica show de bola.

cleiton_herrmann

sei lá, posso estar enganado, mas me parece muita coisa pra fazer um simples controle de acesso, nao tem nd mais simples, sei lá, aquelas navigation rules, filters… ?

cleiton_herrmann

opa raf4ever, blz? então, eu acho q filters vai ser mais simples…

a questão de buscar todos os usuarios, é só pra informar se o nome esta errado ou a senha, é frescura do pessoal aqui… no inicio eu tinha feito como vc falou, e como não terão muitos usuários mesmo, concordei em fazer a consulta dessa forma…

mas eu nao sei fazer esses filters, será q vc ou alguem que esteja lendo ai, poderia dar um exemplo ? ou tutorial que explique direito, pq eu até ja vi vários exemplos na net, mas sempre só tem o código fonte, e eu acabo não entendendo…

vlw t+

R

Filter,meu caro…

R

Olha esse meu exemplo:

public class LoginFilter implements Filter {
	@Override
	public void init(FilterConfig arg0) throws ServletException {}
	@Override
	public void destroy() {}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		try{
			HttpServletRequest httpReq = (HttpServletRequest)req;
			HttpServletResponse httpRes = (HttpServletResponse)res;
			HttpSession session = httpReq.getSession(true);
			if(session.getAttribute("usuario")==null 
					&& !httpReq.getRequestURL().toString().contains("login.jsf")
					&& !httpReq.getRequestURL().toString().endsWith(".css")
					&& !httpReq.getRequestURL().toString().endsWith(".js")
					&& !httpReq.getRequestURL().toString().endsWith(".jpg")
					&& !httpReq.getRequestURL().toString().endsWith(".gif")){
				httpRes.sendRedirect(httpReq.getContextPath()+"/login.jsf");
			}else{
				chain.doFilter(req, res);
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
cleiton_herrmann
nao vai, kkkkkk olha só, eu fiz o seguinte:
public class FiltrarRestricoes implements Filter, Serializable {

    private FilterConfig fc;
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        fc = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        HttpSession session = req.getSession(true);
        String paginaRequisitada = req.getRequestURL().toString();
        
        Usuarios usuario = (Usuarios) session.getAttribute("usuarioLogado");        
        System.out.println("pegou o usuario " + usuario.getNome());
        if (usuario == null && !paginaRequisitada.contains("index.xhtml")) {
            System.out.println("redirecionou para pagina index");
            resp.sendRedirect("index.xhtml");
        } else {
            System.out.println("redirecionou para pagina" + paginaRequisitada);
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
        
    }
    
}
e no web.xml eu coloquei:
<filter>  
        <filter-name>area restrita</filter-name>  
        <filter-class>controle.FiltrarRestricoes</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>area restrita</filter-name>  
        <url-pattern>/enviarPromocoesCliente.xhtml</url-pattern>
    </filter-mapping>
a parte de login na index e verificação de usuario no banco continua igual o primeiro post. quer dizer tem uma diferencinha no método login() do MBUsuarioLogado.
public void login() {
        boolean nomeOk = false;
        boolean senhaOk = false;
        
        usuarioLogado = null;
        usuarios.clear();
        
        Criteria c = hu.getCriteria(Usuarios.class);
        usuarios = dao.listarCriteria(c);
        
        for (Usuarios u : usuarios) {
            if (u.getNome().equals(nome)) {
                nomeOk = true;
                if (u.getSenha().equals(senha)) {
                    senhaOk = true;
                    usuarioLogado = u;
                }
                break;
            }
        }
        
        HttpSession ses = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        ses.removeAttribute("usuarioLogado");
        if (!nomeOk) {
            FacesMessage error = new FacesMessage("Falhou", "Nome incorreto !");
            FacesContext.getCurrentInstance().addMessage(null, error);
        }
        if (!senhaOk) {
            FacesMessage error = new FacesMessage("Falhou", "Senha incorreta !");
            FacesContext.getCurrentInstance().addMessage(null, error);
        }
        if (nomeOk && senhaOk) {
            FacesMessage msg = new FacesMessage("Login OK", usuarioLogado.getNome());
            FacesContext.getCurrentInstance().addMessage(null, msg);
                        
            ses.setAttribute("usuarioLogado", usuarioLogado);
            
            System.out.println("logou usuario " + usuarioLogado.getNome());
        }
        
        nome = "";
        senha = "";
    }
agora eu coloco o usuario na httpsession. Mas se eu tento acessar a pagina restrita, ele acessa normal, nem verifica nd, nao executa o metodo doFilter(...), os System.out ali nao sai nenhum no console... tah faltando alguma coisa?
cleiton_herrmann

falta alguma coisa ? fiz algo errado ? alguem tem ideia do pq nao funciona ?

Polverini

cara eu me bati com o Filter ai usei o PhaseListener muito bom para aplicações pequenas

cleiton_herrmann

então Polverini, pelo q eu vi, o phaselistener vai fazer a validação em todos os acessos, em todas as paginas não é ? ou eu estou enganado, pelo menos eu nao vi onde definir isso, eu quero apenas fazer validação de usuario em determinadas paginas, por isso achei o filter mais facil, com phaselistener tem como eu fazer validação só em algumas paginas? vlw t+

cleiton_herrmann

bom, só pra constar, nao sei se isso tem algum efeito mesmo, mas passou a funcionar hj depois q mudei, lembrei q quando estava mechendo com o file upload do primefaces, vi num forum que o filter dele no web.xml tinha que estar declarado antes de tudo, e hj eu mudei a declaração do filter da validação de usuario, colocando-a antes de tudo, e o método doFilter(...) passou a ser executado, mas agora o problema é q nenhuma pagina é exibida, vou colocar abaixo os trechos de código relevantes...

web.xml
<filter>  
        <filter-name>areaRestrita</filter-name>  
        <filter-class>controle.FiltrarRestricoes</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>areaRestrita</filter-name>  
        <url-pattern>*.xhtml</url-pattern>  
    </filter-mapping>
MBUsuarioLogado.java método que valida usuario e joga na session
public void login() {
        boolean nomeOk = false;
        boolean senhaOk = false;
        
        usuarioLogado = null;
        usuarios.clear();
        
        Criteria c = hu.getCriteria(Usuarios.class);
        usuarios = dao.listarCriteria(c);
        
        for (Usuarios u : usuarios) {
            if (u.getNome().equals(nome)) {
                nomeOk = true;
                if (u.getSenha().equals(senha)) {
                    senhaOk = true;
                    usuarioLogado = u;
                }
                break;
            }
        }
        
        HttpSession ses = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        ses.setAttribute("usuarioLogado", null);
        if (!nomeOk) { 
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Falhou", "Nome incorreto !")); 
        }
        if (!senhaOk) { 
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Falhou", "Senha incorreta !")); 
        }
        if (nomeOk && senhaOk) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Login OK", usuarioLogado.getNome()));
            ses.setAttribute("usuarioLogado", usuarioLogado);
            System.out.println("logou usuario " + usuarioLogado.getNome());
        }
        
        nome = "";
        senha = "";
    }
FiltrarRestricoes.java medodo doFilter(...)
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //Obtem a session
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        HttpSession session = req.getSession();
        String paginaRequisitada = req.getRequestURL().toString();
        
        //Usuarios usuario = (Usuarios) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioLogado");
        Usuarios usuario = null;
        
        if (session.getAttribute("usuarioLogado") != null) {
            usuario = (Usuarios) session.getAttribute("usuarioLogado");
            System.out.println("pegou o usuario " + usuario.getNome());
        }
        //se não há o atributo usuarioLogado e a pagina requisitada não é login.xhtml, redireciona para login.xthml
        if (usuario == null && !paginaRequisitada.contains("login.xhtml")) {
            System.out.println("redirecionou para pagina login");
            resp.sendRedirect("login.xhtml");
        } else {
            System.out.println("redirecionou para pagina " + paginaRequisitada);
            chain.doFilter(request, response);
        }
    }
eu ainda não intendi o pq, mas esses 2 System.out dizendo que redirecionou são impressos na tela "redirecionou para pagina login" e "redirecionou para pagina http://localhost:8080/SuperB/login.xhtml", mas no browser fica em branco, não aparece pagina nenhuma, só a URL que aparece. Alguem tem idéia ?
cleiton_herrmann

EDITADO, falhou a net aqui, achei q nao tinha enviado e acabei enviando duas vezes a mensagem…

M

Mais simples que o JAAS ta difícil! :stuck_out_tongue:
Só indicar a tabela de usuarios e a de roles!

Configuração no Tomcat, através do server.xml, aqui:
http://tomcat.apache.org/tomcat-5.5-doc/realm-howto.html#JDBCRealm

cleiton_herrmann

Pessoal, pq quando eu vou da pagina index.xhtml pra pagina enviarPromocoesCliente.xhtml na url do browser fica aparencendo http://localhost:8080/SuperB/faces/index.xhtml ao invés de aparecer http://localhost:8080/SuperB/faces/enviarPromocoesCliente.xhtml, o filtro acaba não funcionando por causa disso !!! ele nunca acha a minha pagina restrita, mas sim index.xhtml ou se eu acrescentar o arquivo de estilos, ele acha estilos.css ao invés do nome da minha pagina restrita, abaixo tem o código do command link<h:commandLink action="./enviarPromocoesCliente.xhtml"> <h:outputText value="Admin" /> </h:commandLink>e o arquivo de estilos dentro da tag head<link href="./estilos/estilos.css" rel="stylesheet" type="text/css" />

cleiton_herrmann
tentei agora usando phaselistener
public class AuthorizationListener implements PhaseListener {

    @Override
    public void afterPhase(PhaseEvent event) {

        FacesContext facesContext = event.getFacesContext();
        String currentPage = facesContext.getViewRoot().getViewId();
       
        boolean isEnviarPromocoesCliente = false;
        if (currentPage != null) {
            if (currentPage.contains("enviarPromocoesCliente.xhtml")) {
                isEnviarPromocoesCliente = true;
            }
        }
        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
        Usuarios currentUser = (Usuarios) session.getAttribute("usuarioLogado");

        System.out.println((isEnviarPromocoesCliente ? "é epc" : ("não é epc" + (currentPage != null ? " é " + currentPage : ""))) 
                + " | usuario: " + (currentUser == null ? "null" : currentUser.getNome()));
        
        if (isEnviarPromocoesCliente && currentUser == null) {
            System.out.println("entrou");
            NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
            nh.handleNavigation(facesContext, null, "loginPage");
        }
    }

    @Override
    public void beforePhase(PhaseEvent event) {
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }
}
e o facesconfig.xml
<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

    <lifecycle>
        <phase-listener>controle.AuthorizationListener</phase-listener>
    </lifecycle>
    
    <navigation-rule>
        <from-view-id>/*</from-view-id>
        <navigation-case>
            <from-outcome>loginPage</from-outcome>
            <to-view-id>/index.xhtml</to-view-id>
        </navigation-case>
        <redirect/>
    </navigation-rule>
    
</faces-config>
mas não funcionou pelo problema descrito acima, o atraso na atualização da url, caramba nunca vi algo tão simples ser tão complicado, ou eu to sempre indo pelo lugar errado... acho q vou tentar agora com o JAAS, mas o que exatamente eu vou salvar nesse banco de dados, no campo user eu salvo um nome de usuario, mas o que exatamente eu salvo no campo role ?
cleiton_herrmann

pessoal, é isso então ? nao vai funcionar dessa forma pq o JSF trabalha sobre POST e tem atraso na atualização da URL, posso desistir ? eu vi sobre o uso da tag no faces-config.xml nas regras de navegação, mas segundo este tutorial http://www.rponte.com.br/tag/faces-configxml/não é certo fazer uso desta tag sem necessidade…

cleiton_herrmann

pessoal, segundo o tutorial aqui do guj sobre JAAS

este modulo de autenticação será executado pelo servidor de aplicação, antes mesmo de acessar a aplicação
e não é isso q eu quero, eu quero validar usuario somente em determinadas paginas do site, então, voltei agora questão das URLs atrasadas, será q não tem a solução pra essas urls atrasadas? alguma idéia pra me ajudar ?

FernandoFranzini


Escolha o melhor para seu projeto…

cleiton_herrmann

Pessoal, não é possível q vcs que usam filter ou phaselistener, tenham conseguido fazer isso funcionar com as URLs atrasadas do JSF…
Ou ninguem percebeu isso, ou eu q ainda não tomei conhecimento de algum detalhe pra driblar essas URLs atrasadas…
e ai ?

FernandoFranzini

cleiton herrmann:
Pessoal, não é possível q vcs que usam filter ou phaselistener, tenham conseguido fazer isso funcionar com as URLs atrasadas do JSF…
Ou ninguem percebeu isso, ou eu q ainda não tomei conhecimento de algum detalhe pra driblar essas URLs atrasadas…
e ai ?

É so colocar no filtro que vc filtrar os FORWARD pq internamente O JSF navega assim
Vc deve estar usando apenas REQUEST dai fura mesmo…

cleiton_herrmann

meu filter tava só assim<filter> <filter-name>LoginFiltro</filter-name> <filter-class>controle.FiltrarRestricoes</filter-class> </filter> <filter-mapping> <filter-name>LoginFiltro</filter-name> <url-pattern>*.xhtml</url-pattern> </filter-mapping>onde eu coloco essa tag ?

FernandoFranzini

cleiton herrmann:
meu filter tava só assim<filter> <filter-name>LoginFiltro</filter-name> <filter-class>controle.FiltrarRestricoes</filter-class> </filter> <filter-mapping> <filter-name>LoginFiltro</filter-name> <url-pattern>*.xhtml</url-pattern> </filter-mapping>

Pois é…foi como eu falei…use assim:

<filter-mapping>  
    <filter-name>LoginFiltro</filter-name>  
    <url-pattern>*.xhtml</url-pattern>  
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>FORWARD</dispatcher>
	<dispatcher>INCLUDE</dispatcher>
	<dispatcher>ERROR</dispatcher>
</filter-mapping>
cleiton_herrmann

eu consegui fazer, mas de um jeito um pouco diferente dos que eu vi o pessoal comentando ai e nos tutoriais pela net

aqui q eu fiz diferente, eu seto um parametro com o nome da pagina q quero abrir
<h:commandLink action="./enviarPromocoesCliente.xhtml" value="Admin">
        <f:param name="paginaRequisitada" value="enviarPromocoesCliente.xhtml"/>
    </h:commandLink>
classe que implementa phaselistener, e aqui eu recupero o nome da pagina q eu quero abrir através daquele parametro que setei acima, já q a URL sempre esta atrasada....
public class AuthorizationListener implements PhaseListener {

    @Override
    public void afterPhase(PhaseEvent event) {
        FacesContext facesContext = event.getFacesContext();
        String paginaRequisitada = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("paginaRequisitada");
        
        boolean isRestrict = false;
        if (paginaRequisitada != null) {
            if (paginaRequisitada.equals("enviarPromocoesCliente.xhtml")) {
                isRestrict = true;
            }
        }
        
        Usuarios currentUser = (Usuarios) ((HttpSession) facesContext.getExternalContext().getSession(true)).getAttribute("usuarioLogado");

        if (isRestrict && currentUser == null) {
            System.out.println("entrou");
            NavigationHandler nh = event.getFacesContext().getApplication().getNavigationHandler();
            nh.handleNavigation(event.getFacesContext(), null, "loginPage");
        }
    }

    @Override
    public void beforePhase(PhaseEvent event) {
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }
}
faces-config.xml
<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

    <lifecycle>
        <phase-listener>controle.AuthorizationListener</phase-listener>
    </lifecycle>

    <navigation-rule>
        <from-view-id>/*</from-view-id>
        <navigation-case>
            <from-outcome>loginPage</from-outcome>
            <to-view-id>/index.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
    
</faces-config>
a parte diferente que fiz, foi setar um parametro "paginaRequisitada" no faces, quando clico no link para abrir a nova pagina, isso resolveu o problema da url atrasada, mas fiquei na duvida se é uma boa pratica, o que vcs me dizem ??
cleiton_herrmann

FernandoFranzini, vlw por todas as dicas ai, mas só de curioso eu volter a testar com filter, e mesmo colocando as tags como vc falou, não consegui fazer funcionar, as URLs sempre ficam atrasadas, sei lá, por enquanto vou ir levando desse jeito q falei acima.

gostaria se possível da opinião de vcs sobre o código e a questão se usar um parametro para saber a pagina q será aberta…

vlw t+

FernandoFranzini

cleiton herrmann:
FernandoFranzini, vlw por todas as dicas ai, mas só de curioso eu volter a testar com filter, e mesmo colocando as tags como vc falou, não consegui fazer funcionar, as URLs sempre ficam atrasadas, sei lá, por enquanto vou ir levando desse jeito q falei acima.

gostaria se possível da opinião de vcs sobre o código e a questão se usar um parametro para saber a pagina q será aberta…

vlw t+

O JSF realmente muda as url no navegador depois q o usuario ja passou pela pagina…mas não sei oq isso tem haver…
Qual é o seu problema?

cleiton_herrmann

então FernandoFranzini, o problema é nessas linhas de código abaixo na hora de autorizar o acesso para o usuario

a minha situação é assim, pagina index.xhtml, pagina enviarpromocoescliente.xhtml, a index, qualquer pessoa poderá acessar, já a enviarpromocoescliente, só quem tiver um usuario autenticado na sessão, então vc esta na pagina index, já informou usuario e senha e fez o login, e clica para abrir a enviarpromocoescliente.

classe que implementa phaselistenerFacesContext facesContext = event.getFacesContext(); String currentPage = facesContext.getViewRoot().getViewId();o código acima nao me retorna …enviarpromocoescliente.xhtml ele retorna …index.xhtml, então toda a logica de autorização do acesso já era… por isso estou usando aquele parametro para setar a pagina que pretendo carregar quando clico em algum commandlink, só queria saber o q vcs acham desse parametro, se é uma boa pratica, prós e contras…

FernandoFranzini

Realmente usar phaseListener funciona mas tem seu pros ai…eu prefiro usar Filter que é bem melhor…mas para resolver seu problema…para pegar a url atual, acesse via HttpRequest:

HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); String currentPage = req.getRequestURI();
Veja se resolve…

cleiton_herrmann
então FernandoFranzini, abaixo esta o meu filter configurado no web.xml como vc falou
<filter>  
        <filter-name>LoginFiltro</filter-name>  
        <filter-class>controle.FiltrarRestricoes</filter-class>  
    </filter>  
    <filter-mapping> 
        <filter-name>LoginFiltro</filter-name> 
        <url-pattern>*.xhtml</url-pattern> 
        <dispatcher>REQUEST</dispatcher> 
        <dispatcher>FORWARD</dispatcher> 
        <dispatcher>INCLUDE</dispatcher> 
        <dispatcher>ERROR</dispatcher> 
    </filter-mapping>
aqui a classe que implementa filter, só pra testar possui apenas o system.out, se eu fizer do jeito q vc falou
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        
       HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();   
       String currentPage = req.getRequestURI();
       System.out.println("currentPage: " + currentPage);
        
       chain.doFilter(request, response);        
    }
da erro, a linha 48 da stacktrace é referente a linha 2 do código acima
java.lang.NullPointerException
	controle.FiltrarRestricoes.doFilter(FiltrarRestricoes.java:48)
e se eu fizer assim
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        
        HttpServletRequest req = (HttpServletRequest) request;
        String currentPage = req.getRequestURI();
        System.out.println("currentPage: " + currentPage);
        
        chain.doFilter(request, response);        
    }
veja a saida quando executo a aplicação e tento ir pra pagina enviarPromocoesCliente. a ultima linha do console deveria ser /SuperB/faces/enviarPromocoesCliente.xhtml, e se fosse td funcionaria perfeitamente
currentPage: /SuperB/
currentPage: /SuperB/faces/index.xhtml
currentPage: /SuperB/faces/index.xhtml
FernandoFranzini

No caso do null vc fez mancada…dentro do filtro não tem FacesContext !!!
Dai vc pega na próprio parâmetro do métodos como vc fez na segunda vez…Agora de não chegar o URL tem algo errado…eu uso isso em vários projetos e sempre funcionou certinho…Existe algo de errado que vc não percebeu…
Na primeira vez, faz sentido ele mostrar a mesma pagina…pq antes de vc mudar de pagina vc dispara um action…para a mesma…depois q vc retorna String para a proxima navegação…
A não ser que o filtro não esteje sendo executado para a outra URL…como vc ta navegando? qual o endereço a outra? post o seu MDB e seu faces config…

cleiton_herrmann
pois é, realmente a minha falta de experiencia e conhecimento em web tah me fazendo sofrer, mas é assim: usando filter, nem tem o arquivo faces-config.xml no meu projeto, eu uso só o web.xml com a seguinte configuração
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
metadata-complete="true">
    <filter>  
        <filter-name>LoginFiltro</filter-name>  
        <filter-class>controle.FiltrarRestricoes</filter-class>  
    </filter>  
    <filter-mapping> 
        <filter-name>LoginFiltro</filter-name> 
        <url-pattern>*.xhtml</url-pattern> 
        <dispatcher>REQUEST</dispatcher> 
        <dispatcher>FORWARD</dispatcher> 
        <dispatcher>INCLUDE</dispatcher> 
        <dispatcher>ERROR</dispatcher> 
    </filter-mapping>
    <filter>  
        <filter-name>PrimeFaces FileUpload Filter</filter-name>  
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>PrimeFaces FileUpload Filter</filter-name>  
        <servlet-name>Faces Servlet</servlet-name>  
    </filter-mapping>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet>  
        <servlet-name>Resource Servlet</servlet-name>  
        <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>  
    </servlet>     
    <servlet-mapping>  
        <servlet-name>Resource Servlet</servlet-name>  
        <url-pattern>/primefaces_resource/*</url-pattern>  
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
    
</web-app>
dai a classe FiltrarRestricoes
public class FiltrarRestricoes implements Filter, Serializable {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { 
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {              
        HttpServletRequest req = (HttpServletRequest) request;
        String currentPage = req.getRequestURI();
        System.out.println("currentPage: " + currentPage);
        
        chain.doFilter(request, response);                       
    }

    @Override
    public void destroy() {
    }
    
}
ela tem a mesma saida no console das URLs atrasadas que mencionei no post anterior, e a seguir o commandlink na index.xhtml que uso pra acessar a pagina enviarPromocoesCliente.xhtml
<h:commandLink action="./enviarPromocoesCliente.xhtml" value="Admin" />
e agora usando phaselistener, eu tiro aquela configuração de filtro no web.xml e coloco o arquivo faces-config.xml configurado assim
<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

    <lifecycle>
        <phase-listener>controle.AuthorizationListener</phase-listener>
    </lifecycle>

    <navigation-rule>
        <from-view-id>/*</from-view-id>
        <navigation-case>
            <from-outcome>loginPage</from-outcome>
            <to-view-id>/index.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
    
</faces-config>
a seguir a classe que implementa phaselistener, lembrando que se eu tentar obter o endereço da url requisitada, ele estará atrasado também, ou seja, mesmo problema que venho enfrentando com o filter, mas o código abaixo esta pegando o valor do parametro que setei no commandlink
public class AuthorizationListener implements PhaseListener {

    @Override
    public void afterPhase(PhaseEvent event) {
        FacesContext facesContext = event.getFacesContext();
        String paginaRequisitada = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("paginaRequisitada");
        
        boolean isRestrict = false;
        if (paginaRequisitada != null) {
            if (paginaRequisitada.equals("enviarPromocoesCliente.xhtml")) {
                isRestrict = true;
            }
        }
        
        Usuarios currentUser = (Usuarios) ((HttpSession) facesContext.getExternalContext().getSession(true)).getAttribute("usuarioLogado");

        System.out.println((isRestrict ? "é restrita" : ("não é restrita" + (paginaRequisitada != null ? " é " + paginaRequisitada : ""))) 
                + " | usuario: " + (currentUser == null ? "null" : currentUser.getNome()));

        if (isRestrict && currentUser == null) {
            System.out.println("entrou");
            NavigationHandler nh = event.getFacesContext().getApplication().getNavigationHandler();
            nh.handleNavigation(event.getFacesContext(), null, "loginPage");
        }
    }

    @Override
    public void beforePhase(PhaseEvent event) {
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }
}
e abaixo o código do commandllink na index.xhtml
<h:commandLink action="./enviarPromocoesCliente.xhtml" value="Admin">
                <f:param name="paginaRequisitada" value="enviarPromocoesCliente.xhtml"/>
            </h:commandLink>
é isso q estou fazendo, tah faltando alguma configuração ? vlw pela ajuda ai t+
FernandoFranzini

Vc não precisa do phase listener só o filtro ja faz tudo…ou faz com 1 ou com outro…Filter é o mais indicado

  1. Retire a declaração do phase listener do faces-config pode até estar atrapalhando.
  2. troca a URL do seu filter para
    <url-pattern>/*</url-pattern>
    E veja o q vai imprimir…
  3. Sua ação esta estranha…nunca vi isso meu !!

<h:commandLink action="./enviarPromocoesCliente.xhtml" value=“Admin”>
<f:param name=“paginaRequisitada” value=“enviarPromocoesCliente.xhtml”/>
</h:commandLink>
Pra quer serve esse <f:param ???
Isso ai ta estranho…vc navega declarando via na handler ou direto…pode ser isso que ta te bugandooo

Faça assim:
Declare:

<blockquote><navigation-rule>

<navigation-case>

<from-outcome>OutraPagina</from-outcome>

<to-view-id>/enviarPromocoesCliente.xhtml</to-view-id>

</navigation-case>

</navigation-rule>

</blockquote>

Na pagina faça

<h:commandLink action=“OutraPagina” value=“Admin”>

Outra coisa… vc não precisa usar <from-view-id>/*</from-view-id>
é so retirar isso que ja é de qualquer view…

Como vc pode ver…não é o filtro q não esta funcionando…é sua forma de navegar…
Isso ta funcionando??? affff

cleiton_herrmann

acho q vc não entendeu o q eu fiz FernandoFranzini , eu nao fiz td isso ao mesmo tempo, ou eu estava usando o filter ou o phaselistener, e esse f:param q vc disse q nunca viu, é forma q eu encontrei pra pegar a pagina que está sendo carregada, é isso q eu estou pedindo a opinião de vcs há uns 4 posts hahahaha, mas vamos lá, vou testar aqui denovo do jeito q vc sugeriu, e depois volto a postar certinho como eu programei e o resultado, tomara q funcione, kkkkk

FernandoFranzini

Então…desculpa a confusão mas vc não precisa fazer isso…senão vai ter que passar isso em todos as navegações do seu sistema…absurdo…
O getURL do HttpServletRequest te da acesso dinâmico a esse valor…

cleiton_herrmann

é isso mesmo q fiquei encomodado, em todos os commandlinks ter q colocar o f:param com o nome da pagina q vai ser carregada

FernandoFranzini

Então faça:

  1. o filtro logar as páginas mas interceptando tudo “/*” como eu falei
  2. Coloca a navegação do faceConfig com handler nomal
  3. Faça a navegação e veja o log…
    Só não vai dar certo se vc fizer algo errado…
cleiton_herrmann
blz, vamos ver se eu pulei alguma parte arquivo web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
metadata-complete="true">
    <filter>  
        <filter-name>LoginFiltro</filter-name>  
        <filter-class>controle.FiltrarRestricoes</filter-class>  
    </filter>  
    <filter-mapping> 
        <filter-name>LoginFiltro</filter-name> 
        <url-pattern>/*</url-pattern> 
        <dispatcher>REQUEST</dispatcher> 
        <dispatcher>FORWARD</dispatcher> 
        <dispatcher>INCLUDE</dispatcher> 
        <dispatcher>ERROR</dispatcher> 
    </filter-mapping>
    <filter>  
        <filter-name>PrimeFaces FileUpload Filter</filter-name>  
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>PrimeFaces FileUpload Filter</filter-name>  
        <servlet-name>Faces Servlet</servlet-name>  
    </filter-mapping>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet>  
        <servlet-name>Resource Servlet</servlet-name>  
        <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>  
    </servlet>     
    <servlet-mapping>  
        <servlet-name>Resource Servlet</servlet-name>  
        <url-pattern>/primefaces_resource/*</url-pattern>  
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
    
</web-app>
arquivo faces-config.xml
<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">


    <navigation-rule> 
        <navigation-case> 
            <from-outcome>outrapagina</from-outcome> 
            <to-view-id>/enviarPromocoesCliente.xhtml</to-view-id> 
        </navigation-case> 
    </navigation-rule> 
</faces-config>
classe FiltrarRestricoes que implementa filter
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {               
        HttpServletRequest req = (HttpServletRequest) request;
        String currentPage = req.getRequestURI();
        System.out.println("currentPage: " + currentPage);
        
        chain.doFilter(request, response);               
    }
commandlink na index.xhtml
<h:commandLink action="./enviarPromocoesCliente.xhtml" value="Admin" />
e finalmente após executar o site, e clicar apenas uma vez para carregar a pagina enviarPromocoesCliente.xhtml, temos todos esses System.out ai embaixo, menos o que eu quero que é o da pagina enviarPromocoesCliente.xhtml hahaha mas nao sei qual foi a parte q eu pulei... cara valeu pela ajuda ai e pelas explicações até agora !!!
currentPage: /SuperB/
currentPage: /SuperB/faces/javax.faces.resource/growl/assets/growl.css
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/theme.css
currentPage: /SuperB/faces/javax.faces.resource/jquery/jquery.js
currentPage: /SuperB/faces/javax.faces.resource/growl/growl.js
currentPage: /SuperB/faces/javax.faces.resource/forms/forms.js
currentPage: /SuperB/faces/javax.faces.resource/core/core.js
currentPage: /SuperB/faces/javax.faces.resource/forms/forms.css
currentPage: /SuperB/faces/javax.faces.resource/password/password.css
currentPage: /SuperB/faces/javax.faces.resource/jquery/ui/jquery-ui.js
currentPage: /SuperB/faces/javax.faces.resource/button/button.js
currentPage: /SuperB/faces/javax.faces.resource/jquery/ui/jquery-ui.css
currentPage: /SuperB/faces/javax.faces.resource/yui/utilities/utilities.js
currentPage: /SuperB/faces/javax.faces.resource/ajaxstatus/ajaxstatus.js
currentPage: /SuperB/faces/javax.faces.resource/password/password.js
currentPage: /SuperB/faces/javax.faces.resource/paginator/paginator.css
currentPage: /SuperB/faces/javax.faces.resource/datagrid/datagrid.css
currentPage: /SuperB/faces/javax.faces.resource/panel/panel.js
currentPage: /SuperB/faces/javax.faces.resource/dialog/dialog.js
currentPage: /SuperB/faces/javax.faces.resource/wijmo/wijmo.js
currentPage: /SuperB/faces/javax.faces.resource/panel/panel.css
currentPage: /SuperB/faces/javax.faces.resource/paginator/paginator.js
currentPage: /SuperB/faces/javax.faces.resource/wijmo/wijmo.css
currentPage: /SuperB/faces/javax.faces.resource/autocomplete/autocomplete.js
currentPage: /SuperB/estilos/estilos.css
currentPage: /SuperB/faces/javax.faces.resource/datagrid/datagrid.js
currentPage: /SuperB/faces/javax.faces.resource/jsf.js
currentPage: /SuperB/imagens/frenteSuperB.png
currentPage: /SuperB/imagens/carregando.gif
currentPage: /SuperB/imagens/logoSuperB.png
currentPage: /SuperB/faces/index.xhtml
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/ui-default.png
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/ui-bg_flat_75_ffffff_40x100.png
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/ui-icons_222222_256x240.png
currentPage: /SuperB/faces/index.xhtml
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/theme.css
currentPage: /SuperB/faces/javax.faces.resource/growl/assets/growl.css
currentPage: /SuperB/faces/javax.faces.resource/jquery/jquery.js
currentPage: /SuperB/faces/javax.faces.resource/core/core.js
currentPage: /SuperB/faces/javax.faces.resource/growl/growl.js
currentPage: /SuperB/faces/javax.faces.resource/yui/utilities/utilities.js
currentPage: /SuperB/faces/javax.faces.resource/datatable/datatable.css
currentPage: /SuperB/faces/javax.faces.resource/fileupload/fileupload.css
currentPage: /SuperB/faces/javax.faces.resource/fileupload/fileupload.js
currentPage: /SuperB/faces/javax.faces.resource/jquery/ui/jquery-ui.css
currentPage: /SuperB/faces/javax.faces.resource/paginator/paginator.css
currentPage: /SuperB/faces/javax.faces.resource/paginator/paginator.js
currentPage: /SuperB/faces/javax.faces.resource/button/button.js
currentPage: /SuperB/faces/javax.faces.resource/jquery/ui/jquery-ui.js
currentPage: /SuperB/faces/javax.faces.resource/editor/editor.css
currentPage: /SuperB/faces/javax.faces.resource/forms/forms.js
currentPage: /SuperB/faces/javax.faces.resource/datatable/datatable.js
currentPage: /SuperB/faces/javax.faces.resource/editor/editor.js
currentPage: /SuperB/faces/javax.faces.resource/jsf.js
currentPage: /SuperB/faces/estilos/estilos.css
currentPage: /SuperB/estilos/estilos.css
currentPage: /SuperB/faces/javax.faces.resource/forms/forms.css
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/ui-default.png
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/sprite.png
currentPage: /SuperB/faces/javax.faces.resource/editor/images/toolbar.gif
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/ui-bg_flat_75_ffffff_40x100.png
currentPage: /SuperB/faces/javax.faces.resource/editor/images/buttons.gif
currentPage: /SuperB/faces/javax.faces.resource/fileupload/uploadify.swf
currentPage: /SuperB/faces/javax.faces.resource/fileupload/uploadify.swf
FernandoFranzini

Vc entro na pagina index…e clickou no command link…ele navegou para outra pagina e não apareceu no filtro que esta interceptando tudo?

Outra coisa troque o :
<h:commandLink action="./enviarPromocoesCliente.xhtml" value=“Admin” />
para
<h:commandLink action=“outrapagina” value=“Admin” />

Por que apareceu tudo menos a outra pagina? kkkkkk essa foi boa…só com vc mesmo…

cleiton_herrmann

aaaah vamos ver, nao tinha atentado pra esse detalhe<h:commandLink action="outrapagina" value="Admin" /> colocar o nome da regra de navegação no lugar do nome da pagina…

FernandoFranzini

Veja ai…

cleiton_herrmann

é continuou não aparecendo a url da pagina carregada, mesmo com a alteração acima

FernandoFranzini

Veja…o filtro esta interceptando todos dos HTTP GET que a navegador esta fazendo - CSS, JS, IMAGENS etc…porque sua pagina não aparece?? kkkkkk
A unica forma de sua pagina não esta aparecendo é ela não estar sendo chamando…ou ela esta sendo chamado e o filtro não esta sendo executando quando na hora de navegação…
Eu não sei mais como te ajudar…só depurando mesmo…

cleiton_herrmann

caramba qui zica meu, kkkk nao sei mais o q tentar tbem

FernandoFranzini

O projeto é grande?
Ta rodando aonde?

cleiton_herrmann

talvez te ajude a me ajudar mais um pouco, na pagina enviarPromocoesCliente.xhtml tem um commandlink<h:commandLink action="voltarIndex" value="Voltar para página inicial" />no faces-config.xml tem a sua devida regra declarada<navigation-rule> <navigation-case> <from-outcome>voltarIndex</from-outcome> <to-view-id>/index.xhtml</to-view-id> </navigation-case> </navigation-rule>e quando eu clico para voltar pra pagina index.xhtml no browser aparece o seguinte erroThis XML file does not appear to have any style information associated with it. The document tree is shown below. <partial-response> <changes> <update id="javax.faces.ViewState"> <![CDATA[ 318739541256570587:-1634689407217682932 ]]> </update> </changes> <extension primefacesCallbackParam="validationFailed">{"validationFailed":false}</extension> </partial-response>só que nessa hora, aparece a bendita url nos System.out lá na classe que intercepta…

FernandoFranzini

cleiton herrmann:
talvez te ajude a me ajudar mais um pouco, na pagina enviarPromocoesCliente.xhtml tem um commandlink<h:commandLink action="voltarIndex" value="Voltar para página inicial" />no faces-config.xml tem a sua devida regra declarada<navigation-rule> <navigation-case> <from-outcome>voltarIndex</from-outcome> <to-view-id>/index.xhtml</to-view-id> </navigation-case> </navigation-rule>e quando eu clico para voltar pra pagina index.xhtml no browser aparece o seguinte erroThis XML file does not appear to have any style information associated with it. The document tree is shown below. <partial-response> <changes> <update id="javax.faces.ViewState"> <![CDATA[ 318739541256570587:-1634689407217682932 ]]> </update> </changes> <extension primefacesCallbackParam="validationFailed">{"validationFailed":false}</extension> </partial-response>só que nessa hora, aparece a bendita url nos System.out lá na classe que intercepta…
]

Tem coisa errada…vc deve estar usando alguma coisa do prime que esta fazendo estes comportamentos inesperados…isso ta parecendo que vc ta trocando de paginas usando AJAX…
Posta sua pagina index ai…

cleiton_herrmann
então FernandoFranzini, o projeto não é grande não, pelo menos em principio, consiste numa pagina inicial que vai exibir um catalogo, nela também existirão alguns filtros para pesquisar produtos, e quando for feita uma pesquisa, o catalogo não é mostrado, e sim um datagrid com os produtos encontrados.... também tem um p:dialog pro cliente se cadastrar e receber promocoes por email e um p:dialog para exibir os detalhes do produto selecionado, isso tudo é acessível para qualquer pessoa, dai tem a pagina usada pra montar um email e ativar o processo de envio para os clientes cadastrados... haverão mais coisas, mas por hora é isso que será feito e colocado no ar... segue abaixo a index.xhtml, meio grande o código mais tah ai...
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    
    <h:head>
        <title>Atacado Super B</title>
        <link href="./estilos/estilos.css" rel="stylesheet" type="text/css" />
    </h:head>
    <h:body>
        <h:form prependId="false" >
            <p:growl id="messages" showDetail="true" life="2000" />
            <h:commandLink action="outrapagina" value="Admin" /> 
            
            <h:panelGrid id="pgLogin" columns="1" style="width:100%;text-align: right" border="1">
                <p:outputPanel>
                    <h:outputText id="usuario" 
                                  value="#{mBUsuarioLogado.usuarioLogado.nome}" 
                                  rendered="#{not empty mBUsuarioLogado.usuarioLogado}"/>
                    <h:outputText value="Nome:"/>
                    <p:inputText id="nomeusuario" 
                                 value="#{mBUsuarioLogado.nome}" 
                                 style="width: 70px;font-family: Tahoma;font-size: 12px"/>
                    <h:outputText value="Senha:" />
                    <p:password id="senhausuario" 
                                value="#{mBUsuarioLogado.senha}" 
                                feedback="false" 
                                style="width: 70px;font-family: Tahoma;font-size: 12px"
                                minLength="3"/>
                    <p:commandButton value="Entrar"
                                     action="#{mBUsuarioLogado.login()}" 
                                     update="messages,pgLogin,usuario"
                                     style="width: 50px;font-family: Tahoma;font-size: 12px"
                                     rendered="#{empty mBUsuarioLogado.usuarioLogado}"/>
                    <p:commandButton value="Sair"
                                     action="#{mBUsuarioLogado.logout()}" 
                                     update="messages,pgLogin,usuario"
                                     style="width: 50px;font-family: Tahoma;font-size: 12px"
                                     rendered="#{not empty mBUsuarioLogado.usuarioLogado}"/>
                </p:outputPanel>
            </h:panelGrid>
            
            <h:panelGrid columns="3" style="width:100%; font-family: Tahoma; font-size: 12px">
                <h:column>
                    <div align="center">
                        <p:graphicImage value="/imagens/frenteSuperB.png" />
                    </div>
                </h:column>
                
                <h:column>
                    <div align="center">
                        <h:outputText value="#{mBCabecalhoPaginaInicial.apresentacao}" escape="false"/>
                        <p:commandLink oncomplete="cadastroEmailDialog.show()">
                            <h:outputText value="#{mBCabecalhoPaginaInicial.ofertaEmail}" escape="false"/>
                        </p:commandLink>
                    </div>
                </h:column>

                <h:column>
                    <div align="center">
                        <p:graphicImage value="/imagens/logoSuperB.png"/>
                    </div>
                </h:column>
            </h:panelGrid>
            
            <p:separator style="width:100%;height:1px; font-family: Tahoma; font-size: 12px;background-color: gold;border-style: solid" />
            
            <h:panelGrid id="pgPrincipal" 
                         columns="2" 
                         columnClasses="colFiltros, pgPrincipalCol2">
                
                    <h:panelGrid id="filtro" columns="2" columnClasses="coluna1,coluna2">
                        <f:facet name="header">
                            <h:outputText value="Pesquisa de produtos" />
                        </f:facet>
                        
                        <h:outputText value="Código:" />  
                        <p:inputText id="codigo" 
                                     value="#{mBProduto.codigoFiltro}" required="false" 
                                     style="width: 200px;"/>  

                        <h:outputText value="Descrição:" />  
                        <p:inputText id="descricao" 
                                     value="#{mBProduto.nomeFiltro}" required="false" 
                                     style="width: 200px"/>  

                        <f:facet name="footer">
                            <p:separator style="width:100%;height:1px;" />
                            <p:commandButton value="Filtrar produtos"
                                             action="#{mBProduto.listarProdutos()}"
                                             update="pgPrincipal,listaProdutosGrid" 
                                             style="font-family: Tahoma;font-size: 12px;width: 120px"/>
                            
                            <p:commandButton value="Limpar filtros" 
                                             action="#{mBProduto.limparFiltros()}"
                                             update="pgPrincipal,listaProdutosGrid,filtro" 
                                             style="font-family: Tahoma;font-size: 12px;width: 120px"/>
                            
                            <p:ajaxStatus style="width:16px;height:16px;">  
                                <f:facet name="start">  
                                    <p:graphicImage value="/imagens/carregando.gif" />  
                                </f:facet>  

                                <f:facet name="complete">  
                                    <h:outputText value="#{mBProduto.info}" />  
                                </f:facet>  
                            </p:ajaxStatus>
                        </f:facet>
                    </h:panelGrid>
                
                    <p:outputPanel id="listaProdutosGrid" rendered="#{mBProduto.produtos.size() > 0}">
                        <p:dataGrid styleClass="ui-paginator-current" 
                                    id="listaProdutos" var="produto" value="#{mBProduto.produtos}" 
                                    columns="3" rows="9" paginator="true" effect="true" 
                                    paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
                                    rowsPerPageTemplate="6,9">  

                            <p:column>  
                                <p:panel header="Código: #{produto.codigo}" style="text-align:center; font-family: Tahoma; font-size: 10px">  
                                    <h:panelGrid columns="3" style="width:100%"> 

                                        <p:graphicImage value="#{mBProduto.imagem100x100}">
                                            <f:param name="product_id" value="#{produto.codigo}"/>
                                        </p:graphicImage>

                                        <h:outputText value="#{produto.nome}" /> 

                                        <p:commandLink title="Detalhes" oncomplete="produtoDialog.show()" update="produtoDetalhe">  
                                            <p:graphicImage value="/imagens/lupa.png"/>   
                                            <f:setPropertyActionListener value="#{produto}" target="#{mBProduto.prodSelecionado}" />  
                                        </p:commandLink>
                                    </h:panelGrid>  
                                </p:panel>  
                            </p:column>
                        </p:dataGrid>
                    </p:outputPanel>
                    
                    <p:outputPanel id="catalogo" rendered="#{mBProduto.produtos.size() == 0}">
                        <p:graphicImage value="/imagens/logoSuperB.png"/>
                    </p:outputPanel>
            </h:panelGrid>
            
            <p:dialog header="Detalhes do produto" widgetVar="produtoDialog" modal="true" width="620" height="620">
                <p:outputPanel id="produtoDetalhe" style="text-align:center" layout="block"> 
                    
                    <p:graphicImage value="#{mBProduto.imagem600x600}">
                        <f:param name="product_id" value="#{mBProduto.prodSelecionado.codigo}"/>
                    </p:graphicImage>
                    
                    <h:panelGrid  columns="2" cellpadding="5">  
                        <h:outputLabel for="idSelecionado" value="Id: " />  
                        <h:outputText id="idSelecionado" value="#{mBProduto.prodSelecionado.id}" />  

                        <h:outputLabel for="descricaoSelecionada" value="Descrição: " />  
                        <h:outputText id="descricaoSelecionada" value="#{mBProduto.prodSelecionado.nome}" />  
                    </h:panelGrid>  
                </p:outputPanel>  
            </p:dialog>
            
            <p:dialog header="Cadastro de email" widgetVar="cadastroEmailDialog" modal="true" width="505" height="200">
                <p:outputPanel id="cadastroEmail" layout="block">
                    <p:growl id="growl" showDetail="true" life="7000" />

                    <h:panelGrid id="cadastroCliente" columns="2" columnClasses="coluna1, coluna2">
                        <h:outputLabel value="* Nome:" />  
                        <p:inputText id="nome" 
                                     value="#{mBClientes.clienteInserir.nome}" 
                                     style="width: 400px"/>  

                        <h:outputLabel value="* Email:" />  
                        <p:inputText id="email" 
                                     value="#{mBClientes.clienteInserir.email}" 
                                     style="width: 400px"/>

                        <h:outputLabel value="* Cidade:" />  
                        <p:autoComplete id="cidade" 
                                    value="#{mBClientes.clienteInserir.idcidade}"
                                    completeMethod="#{mBClientes.completaCidade}" 
                                    var="cidade" 
                                    itemLabel="#{cidade.toString()}"
                                    itemValue="#{cidade}" 
                                    converter="cidadeConverter"
                                    style="width: 400px"/>
                        
                        <f:facet name="footer">
                            <p:separator style="width:100%;height:1px; font-family: Tahoma; font-size: 12px" />
                            <p:commandButton value="Cadastrar meus dados" 
                                         action="#{mBClientes.inserir()}" 
                                         update="cadastroCliente,growl" 
                                         style="font-family: Tahoma;font-size: 12px;width: 100%"/>
                        </f:facet>
                    </h:panelGrid>
                </p:outputPanel>  
            </p:dialog>
            
        </h:form>
    </h:body>
</html>
FernandoFranzini

Então meu querido…não consegui ver nada de errado não…
Unica coisa que eu sei é que o filtro funciona sim, eu e muitos tem usado com JSF + serlvet filter e funciona sem qualquer complicador…
Infelizmente sem depurar eu não consigo apontar o que esta acontecendo quando vc diz que o filtro não intercepta sua pagina.
Aconselho vc a procurar uma consultoria java mais perto…
Boa semana.

cleiton_herrmann

pois é cara, eu to usando o tomcat aqui, esqueci de mencionar antes, eu vou continuar fazendo mais alguns testes aqui, não sei realmente nem o que tentar mais…
como o projeto não é grande e ainda esta no inicio, eu acho q vou tentar criar um novo projeto e a primeira coisa q vou fazer nele é implementar um filter, pra ver se funciona, se der certo só mudo de projeto dai, pode ser algo q fiz errado nesse projeto q esteja causando isso…

eu tbem tenho certeza q funciona, pois se não funcionasse não haveria tantos tutoriais na net e exemplos disso… tanto usando filter quanto usando phaselistener…

no mais muito obrigado pela ajuda… e se conseguir fazer funcionar e descobrir o que é, eu volto a postar a solução aqui, vlw !!!

cleiton_herrmann
caramba, acabei de criar um projeto web aqui no netbeans, tah cruzinho da silva, as unicas coisas q fiz foram: 1- criar mais 2 paginas (pagina1.xhtml e pagina2.xhtml), 2- criar o pacote 'controle' e a classe de filtro dentro dele 3- criar o faces-config.xml e configurar as navegaçoes 4- configurar o filtro no web.xml utilizando o proprio Netbeans pra isso, fazendo com q ele mesmo gere o código segue abaixo os arquivos que mechi index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:commandLink action="pagina1" value="pagina1" />
            <br/>
            <h:commandLink action="pagina2" value="pagina2" />
            <br/>
            Hello from Facelets
        </h:form>
    </h:body>
</html>
pagina1.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:commandLink action="index" value="index" />
            Pagina 1
        </h:form>
    </h:body>
</html>
pagina2.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:commandLink action="index" value="index" />
            Pagina 2
        </h:form>
    </h:body>
</html>
faces-config.xml
<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

    <navigation-rule>   
        <navigation-case>   
            <from-outcome>pagina1</from-outcome>   
            <to-view-id>/pagina1.xhtml</to-view-id>   
        </navigation-case>   
    </navigation-rule>
    
    <navigation-rule>   
        <navigation-case>   
            <from-outcome>pagina2</from-outcome>   
            <to-view-id>/pagina2.xhtml</to-view-id>   
        </navigation-case>   
    </navigation-rule>
    
    <navigation-rule>   
        <navigation-case>   
            <from-outcome>index</from-outcome>   
            <to-view-id>/index.xhtml</to-view-id>   
        </navigation-case>   
    </navigation-rule>
</faces-config>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <filter>
        <filter-name>FiltrarRestricoes</filter-name>
        <filter-class>controle.FiltrarRestricoes</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FiltrarRestricoes</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
    <security-constraint>
        <display-name>Restrição1</display-name>
    </security-constraint>
</web-app>
classe interceptadora
package controle;

import java.io.IOException;
import java.io.Serializable;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/**
 *
 * @author Cleiton
 */
public class FiltrarRestricoes implements Filter, Serializable {

    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String currentPage = req.getRequestURI();
        System.out.println("currentPage: " + currentPage + "\n----------");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }
    
}
saida no console após executar, como vcs podem ver pelos System.out no console, a URL sempre está uma atrasada...
----------após executar o projeto----------
currentPage: /TesteLogin/
currentPage: /TesteLogin/faces/javax.faces.resource/jsf.js

----------após clicar no link para pagina1.xhtml----------
currentPage: /TesteLogin/faces/index.xhtml
currentPage: /TesteLogin/faces/javax.faces.resource/jsf.js

----------após clicar no link para index.xhtml----------
currentPage: /TesteLogin/faces/pagina1.xhtml
currentPage: /TesteLogin/faces/javax.faces.resource/jsf.js

----------após clicar no link para pagina2.xhtml----------
currentPage: /TesteLogin/faces/index.xhtml
currentPage: /TesteLogin/faces/javax.faces.resource/jsf.js

----------após clicar no link para index.xhtml----------
currentPage: /TesteLogin/faces/pagina2.xhtml
currentPage: /TesteLogin/faces/javax.faces.resource/jsf.js
tah locu, será possível q só eu nesse brasil inteiro ja passou por isso? alguem tem idéia de alguma configuração que tenha ficado faltando ?
FernandoFranzini

Ola Cleiton

Eu montei um ambiente de teste aqui e eu descobri o problema…realmente esta acontecendo oque vc falou por 2 motivos:

  1. JSF 1 tem o ciclo de vida JSP comum, quando vc faz um forward de uma navegação o filtro é disparado…mas no JSF 2 parece que mudou devido ao xhtml ou facelets nativos agora da especificação. Foi por isso que eu falei que funcionava…mas no JSF 2 não esta.
  2. JSF 2 tem um novo ciclo de vida (que eu ainda não sei o motivo) que não dispara o FORWARD quando vc navega…por isso o filtro não esta funcionando…eu ainda não sei exatamente mas vou procurar e resolver da melhor forma para vc.
  3. Para remediar seu problema vc pode declarar as navegações como REDIREC…colocando assim em todas as navegações:
&lt;navigation-rule&gt;     
        &lt;navigation-case&gt;     
            &lt;from-outcome&gt;pagina1&lt;/from-outcome&gt;     
            &lt;to-view-id&gt;/pagina1.xhtml&lt;/to-view-id&gt; 
            &lt;redirect/&gt;    
        &lt;/navigation-case&gt;     
    &lt;/navigation-rule&gt;  
      
    &lt;navigation-rule&gt;     
        &lt;navigation-case&gt;     
            &lt;from-outcome&gt;pagina2&lt;/from-outcome&gt;     
            &lt;to-view-id&gt;/pagina2.xhtml&lt;/to-view-id&gt;     
            &lt;redirect/&gt;    
        &lt;/navigation-case&gt;     
    &lt;/navigation-rule&gt;  
      
    &lt;navigation-rule&gt;     
        &lt;navigation-case&gt;     
            &lt;from-outcome&gt;index&lt;/from-outcome&gt;     
            &lt;to-view-id&gt;/index.xhtml&lt;/to-view-id&gt;     
            &lt;redirect/&gt;    
        &lt;/navigation-case&gt;     
    &lt;/navigation-rule&gt;

Isso vai resolver e tudo vai ficar funcionando sem problemas…unica situação é que isso não é indicado pq fazer o browser mandar um 301 requisitando a nova pagina…deixando sua aplicação relativamente mais lenda…
No resto vou procurar na especificação o motivo do POR QUE a forward interno do JSF 2 agora não disparar o filtro…
Depois eu posto ai…

cleiton_herrmann

pelo menos agora estamos em conformidade, kkkkk eu ja tinha visto sobre o , mas não quiz usar ele pelo motivo q vc ja sabe, e foi isso que me levou a utilizar aquele f:param pra setar na seção o nome da pagina q eu quero carregar, pra poder usar esse parametro na classe interceptadora, levando em consideração q é um simples parametro, não causaria lentidão na aplicação, o unico problema é q teria q setar um valor nele em cada link de cada pagina…

por enquanto a melhor solução q consegui pensar foi a utilização desse parametro, mas vou continuar dando mais uma pesquisada… qualquer coisa q achar volto a postar aqui tbem

obrigado cara t+

FernandoFranzini

Então cleiton
Pelo que eu vi no JSF 2, na navegação não disparar o forward e por isso o filtro não intercepta pq ele não vai para outra pagina…o JSF 2 simplesmente consegue resolver a outra pagina internamente…desculpe ter falado que funcionava…pq no JSF 1.2 funciona sim… kkkkk Me desculpe.
É um caso de nova versão…
Vou procurar a resposta e como resolver da melhor forma…

cleiton_herrmann

que isso nem esquenta, é q eu tbem estou começando agora a trabalhar com web, então já comecei no JSF 2, mas nem me liguei nessa parada de versão tbem…

FernandoFranzini

Então meu…tenho 11 anos de Java e 5 com JSF! Kkkk
Estou super intrigado com esse comportamento…pq acabei de ler na especificação…

Como eu falei…era para ele disparar…mas espera que vou descobrir…

cleiton_herrmann

então, acabei de ler umas parada interessante aqui…

http://java.dzone.com/articles/fluent-navigation-jsf-2
http://java.dzone.com/articles/fluent-navigation-jsf-2?page=0,1

FernandoFranzini

Ainda não descobri o pq…estou nos foruns americanos…mas ninguem me falou o pq…só sei que no JSF 2 o ciclo de vida das paginas XHTML é resolvida pelo FACELETS e por isso o filtro não esta sendo invocado na hora de trocar a pagina…
Logo que eu resolver, eu posto aqui…

FernandoFranzini

Bom ja descobri algo…
Se vc usar as paginas do seu projeto com JSP ao invés de XHTML vc vera que o filtro sera executado certinho…o problema é AS PÁGINAS XHTML SÃO EXECUTADAS VIA FACELETS NÃO DISPARANDO O FORWARD do container…isso é até bom , pq gasta bem menos tempo e recursos para gerar a resposta e envia a pagina para o navegador, mas em contra partida…abriu essa brecha de segurança usando Filtro.
Eu criei esse post aqui - http://www.guj.com.br/java/247653-nova-versao-do-jsf-2-nao-dispara-o-forward-na-navegacao-das-paginas-xhtml
vendo se alguem ajuda…
Eu ainda não descobri o porque…

FernandoFranzini

Então para contornar isso, vc deve usar redirect sim…
Fica um pouco mais devagar, mas faz sentido, pq o navegador faz um requet para o servidor e ele dispara o filtro para verificar as regras de autenticação.
É o mais indicado !! ao inves daquele seu de duplicar a URL nos linkssss
Eu termino aqui…
T+

FernandoFranzini

Outra solução que me parece ideal é usar autenticação baseada em PHASE-LISTENER -
http://rodrigolazoti.com.br/2008/09/01/filtrando-u...ados-em-jsf-com-phaselistener/
http://ciromacedo.blogspot.com/2008/06/controle-de-acesso-no-jsf.html


Eu encerro aqui meu querido!
Espero te ajudado 8)
T+

cleiton_herrmann

blz Fernando, agora podemos encerrar a discussão nos dois tópicos, kkkk e eu posso continuar meu projetinho aqui tranquilo sem receio de estar fazendo algo meio errado…

muito obrigado pela ajuda e empenho ai t+

FernandoFranzini

Ok…vc pode fechar no título…

Criado 12 de julho de 2011
Ultima resposta 19 de jul. de 2011
Respostas 63
Participantes 7