Problema com filtro simples e JSF [RESOLVIDO]

3 respostas
F

Oi gente, to tentando fazer um sistema de login de usuarios usando um Filtro, minha aplicação é feita em JSF e Hibernate, porém toda vez que inicializo ela, obtenho um erro

java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.setBufferSize(ResponseFacade.java:232)
        at com.sun.faces.context.ExternalContextImpl.setResponseBufferSize(ExternalContextImpl.java:799)
        at javax.faces.context.ExternalContextWrapper.setResponseBufferSize(ExternalContextWrapper.java:741)
        at com.sun.faces.application.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:265)
        at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:125)
        at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:125)
        at org.richfaces.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:262)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:407)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at br.salesianos.acao.LoginFiltro.doFilter(LoginFiltro.java:49)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:619)

porém o programa ainda funciona, mas eu gostaria de saber qual a causa deste erro? alguém teria alguma ideia?

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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_2_5.xsd">
    <!-- The bare minimum needed for JSF 2.0 is a servlet 2.5
      declaration and the mapping for the FacesServlet.
      Setting PROJECT_STAGE to Development is highly recommended
      during initial development so that you get more helpful
      error messages.

      From JSF 2.0 tutorial at http://www.coreservlets.com/JSF-Tutorial/jsf2/
  -->
    <filter>
        <filter-name>LoginFiltro</filter-name>
        <filter-class>br.salesianos.acao.LoginFiltro</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFiltro</filter-name>
        <url-pattern>*.jsf</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-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>client</param-value>
    </context-param>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>org.richfaces.skin</param-name>
        <param-value>#{skinBean.skin}</param-value>
    </context-param>
</web-app>

LoginFiltro.java

package br.salesianos.acao;

import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
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;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author fabio.guimaraes
 */
public class LoginFiltro implements Filter {

    private static final boolean debug = true;

    // The filter configuration object we are associated with.  If
    // this value is null, this filter instance is not currently
    // configured. 
    private FilterConfig filterConfig = null;

    public LoginFiltro() {
    } 
    
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
	throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        String url = req.getRequestURL().toString();
        Object logged = req.getSession().getAttribute("usuariologado");

        if(logged == null || ((Boolean)logged).booleanValue() == false){
            if(!url.contains("login")) {
                resp.sendRedirect("login.jsf");
            }
        }
	
	try {
	    chain.doFilter(request, response);
	}
	catch(Throwable t) {
	    // If an exception is thrown somewhere down the filter chain,
	    // we still want to execute our after processing, and then
	    // rethrow the problem after that.
	    
	    t.printStackTrace();
	}

	
    }
    
    

    /**
     * Destroy method for this filter 
     */
    public void destroy() { 
    }

    /**
     * Init method for this filter 
     */
    public void init(FilterConfig filterConfig) { 
	
    }
}

login.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                template="/template/principal.xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:rich="http://richfaces.org/rich"
                xmlns:a4j="http://richfaces.org/a4j"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                >


    <ui:define name="menu">
        <div class="menuEntrada" >
            Por favor, forneça <br/>
            seus dados para <br/>
            ter acesso ao sistema.
        </div>
    </ui:define>
    <ui:define name="body">
        <div  align="center">
            <h1>Bem-Vindo</h1>
            <h:form id="FormLogin">
                <table>
                    <tr>
                        <td>Digite seu Login:</td>
                    <td><h:inputText rendered="true" id="loginname" value="#{gravaUsuario.usu_nome}"  /></td>
                    </tr>
                    <tr>
                            <td colspan="2"><h:message  styleClass="mensagemErro" for="loginname" /></td>
                        </tr>
                    <tr>
                        <td>Digite sua senha:</td>
                    <td><h:inputSecret rendered="true" id="password" value="#{gravaUsuario.usu_senha}" /></td>
                    </tr>
                    <tr>
                            <td colspan="2"><h:message  styleClass="mensagemErro" for="password" /></td>
                        </tr>
                    <tr>
                        <td></td>
                        <td><a4j:commandButton id="logar" value="Acessar" action="#{gravaUsuario.fazerLogin}" /></td>
                    </tr>
                </table>

                <br/>
                <rich:message styleClass="mensagemErro" for="logar" />
                <br/>

            </h:form>


        </div>
    </ui:define>

</ui:composition>

GravaUsuario.java(parte dele)

public String fazerLogin() {
        Criteria c = sessao.createCriteria(Usuario.class);
        Criterion _login = Restrictions.eq("usu_nome", getUsu_nome());
        c.add(_login);
        Criterion _senha = Restrictions.eq("usu_senha", getUsu_senha());
        c.add(_senha);
        System.out.println("resultado: "+_login+" - "+getUsu_nome());
        boolean validated;
        if (c.uniqueResult() != null) {
            validated = true;
        }
        else
            validated = false;
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuariologado", validated);

        if(validated)
            return "secBemVindo";
        else
            FacesContext.getCurrentInstance().addMessage("FormLogin:logar", new FacesMessage("Login ou senha incorretos!"));
            return "login";
    }

3 Respostas

F

Pelo que parece o erro não do filtro…é do buffer da resposta feita pela implementação do seu provedor de JSF.
Eu vou chutar…
O seu filtro parece que esta faltando o return…
Acrescente o rertorno na linha:

resp.sendRedirect("login.jsf");
return;

Vc precisa acrescentar o return pq o vc esta redirecionando a resposta…fechando o “state” dela…por isso o faces esta tetando gerar a pagina…mas vc não pode deixar a execução continuar se vc fez redirecionou a coisa.
Veja ai :slight_smile:

F

Poxa,valeu… era isso mesmo, muito obrigado.

F

:smiley:

Criado 23 de maio de 2011
Ultima resposta 24 de mai. de 2011
Respostas 3
Participantes 2