[RESOLVIDO] JSF 2.0 + Primafeces

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.

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

}[/code]

Segue pagina login.xhtml

[code]
<h:head>
Login - Digite o usuario e a senha.
</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>
[/code]

Alguém pode me dar uma luz?

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;

Opa lucas…

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

Grato pela ajuda.

[code]<?xml version="1.0" encoding="UTF-8"?>

JSF

index.xhtml

Faces Servlet javax.faces.webapp.FacesServlet 1 Faces Servlet *.xhtml Faces Servlet *.jsf Faces Servlet /faces/* State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2 javax.faces.STATE_SAVING_METHOD client javax.servlet.jsp.jstl.fmt.localizationContext resources.application javax.faces.PROJECT_STAGE Development com.sun.faces.config.ConfigureListener
<filter>
 <filter-name>FiltroJPA</filter-name>
 <filter-class>filtros.FiltroJPA</filter-class>
FiltroJPA Faces Servlet primefaces.THEME aristo

[/code]

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 ??

Ninguem ? :?

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:

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

Veja se em algum momento ele não passou pelo lugar que era esperado.

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

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…

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:

[code]
verificaUsuario
filtros.FiltroLogin

verificaUsuario /privado/* [/code] Obrigado a todos pela força. Abs