[RESOLVIDO] JSF 2.0 + Primafeces

8 respostas
T

Olá.

Tenho iniciado desenvolvimento com jsf, e estou estranhando um comportamento.

Qndo abro pela primeira vez pagina login.jsf ela ignora o primafaces.
Após efetuar o login corretamente, ele é direcionado para a pagina principal no qual
exibe os componentes primefaces tranquilo. Porém se eu voltar para a pagina de login ele
mostra os componentes visuais do primafaces corretamente. Devido já estar logado.

Segue meu filter.

package filtros;
import java.io.IOException;
import javax.persistence.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class FiltroJPA implements Filter {

	private EntityManagerFactory factory;

	@Override
	public void destroy() {
		this.factory.close();
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
				
		EntityManager entityManager = this.factory.createEntityManager();
		request.setAttribute("entityManager", entityManager);
		
		HttpServletRequest req = (HttpServletRequest) request;
		 HttpSession session = req.getSession();

		 if (session.getAttribute("autenticado") != null
		 || req.getRequestURI().endsWith("login.jsf")) {

			 chain.doFilter(request, response);
			
		 } else {
			 
			 HttpServletResponse res = (HttpServletResponse) response;
			 res.sendRedirect("login.jsf"); 
		 }
		
		 try {
				entityManager.getTransaction().begin();
				entityManager.getTransaction().commit();
			} catch (Exception e) {
				entityManager.getTransaction().rollback();
			} finally {
				entityManager.close();
			}
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		this.factory = Persistence.createEntityManagerFactory("health");
	}
}

Segue pagina login.xhtml

<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>Login -  Digite o usuario e a senha. </title>
    </h:head>
    <h:body>
	    <h:form>
	    	<p:panel header="Digite o usuario e a senha..">  
	   			<h:panelGrid columns="2">  
	   				<h:outputText value="Usuario: " />  
	   				<p:inputText value="#{usuarioMB.login}"/>  
	   				<h:outputText value="Senha: " />  
            		<p:password value="#{usuarioMB.senha}" />  
				    <h:commandButton value="Entrar" action="#{usuarioMB.entrar}"/>  
			   	</h:panelGrid> 
	    	</p:panel>	
	    </h:form>
	    
   	</h:body>
</html>

Alguém pode me dar uma luz?

8 Respostas

llucas

Ai vai um chute do que pode ser o problema.
Ve se no web.xml tem o padrão de url da Faces Servlet
acho que o codigo é mais ou menos assim

<servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>
Verifica se quando tu abre a página de login pela primeira vez aparece na url o /faces/

Se for esse o problema tu pode substituir o /faces/* por *.xhtml; *.jsp;

T

Opa lucas..

Entao, mudei como vc citou, anteriormente estava *faces e agora /faces/*
Porem nao surgiu efeitos, segue meu web.xml.

Grato pela ajuda.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <display-name>JSF</display-name>
  <welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
  </welcome-file-list>

  <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>*.xhtml</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>

  <context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>

  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>

  <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>

  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>
  	
	<filter>
	 <filter-name>FiltroJPA</filter-name>
	 <filter-class>filtros.FiltroJPA</filter-class>
   </filter>
	 
   <filter-mapping>
	 <filter-name>FiltroJPA</filter-name>
	 <servlet-name>Faces Servlet</servlet-name>
   </filter-mapping>
   
<context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>aristo</param-value>
  </context-param>

</web-app>
T

opas.

Removi a verificaçao se o usuario está logado no filter, e as paginas carregaram perfeitamente.

O Filter fico assim…

@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
				
		EntityManager entityManager = this.factory.createEntityManager();
		request.setAttribute("entityManager", entityManager);
		
		 chain.doFilter(request, response);
		
		 try {
			 entityManager.getTransaction().begin();
			 entityManager.getTransaction().commit();
		} catch (Exception e) {
			entityManager.getTransaction().rollback();
		} finally {
			entityManager.close();
		}
	}

Dessa forma o login e a pagina principal funcionam perfeitamente com o primefaces, sera que a verificaçao do usuario poderia ser feito diferente ??

T

Ninguem ? :?

gomesrod

Muito estranho!!!

Algumas verificações adicionais que podem ser feitas:

- As URLs quando você acessa a página de login pela 1a vez e quando acessa pela 2a vez são idênticas?
Pode ser que em uma delas não esteja passando pelo Servlet do faces.

- Coloque mensagens de log nesses pontos:
if (session.getAttribute("autenticado") != null   
         || req.getRequestURI().endsWith("login.jsf")) {   
  
// MENSAGEM DE LOG AQUI
             chain.doFilter(request, response);   
               
         } else {   

// MENSAGEM DE LOG AQUI

             HttpServletResponse res = (HttpServletResponse) response;   
             res.sendRedirect("login.jsf");   
         }
Veja se em algum momento ele não passou pelo lugar que era esperado.
llucas

Pois é essa questão da url que eu to falando
No netBEans por exemplo se você usar o padrão de url que vem por padrão “/faces/*” e executar uma página apertando shift+F6 a url executada será assim “http://localhost:8080/projeto/minhapagina.xhtml” quando deveria ser essa “http://localhost:8080/projeto/faces/minhapagina.xhtml” então os componentes não vão aparecer

G

Tiago…

Estou com um problema mais ou menos semelhante, que eu postei logo abaixo no fórum.

Pelo que eu pude perceber, o problema seu é que o seu filtro fica sendo executado sempre a cada requisição que é feita na página. No caso do Prime, que usa o jQuery, essas requisições são constantes. E como você somente deixa passar se o filtro é executado corretamente, os componentes do prime não são carregados, pois não são executados porque o filtro o barrou.

a separação de pastas poderia resolver o problema - mas acho que aí você cairia no problema que eu estou…

T

Opa gapler.

Obrigado pela ajuda cara, olhei seu tópico e consegui resolver separando o login do restante da aplicação.

Fica a dica pra quem tiver o mesmo problema, separei o login da aplicacao com um folder "privado" sendo que o filtro
só será executado quando se referir a esse diretório.. E é claro nao se esqueçam de mudar no xml.

Segue:
<filter>
 <filter-name>verificaUsuario</filter-name>
 <filter-class>filtros.FiltroLogin</filter-class>
</filter> 

<filter-mapping> 
 <filter-name>verificaUsuario</filter-name> 
 <url-pattern>/privado/*</url-pattern>
</filter-mapping>
Obrigado a todos pela força. Abs
Criado 31 de maio de 2011
Ultima resposta 7 de jun. de 2011
Respostas 8
Participantes 4