Erro JSF 1.2 e Filtro

3 respostas
rafdutra

Boa tarde pessoal.

Estou implementando um sistema que possui login por autenticação. Utilizo um filtro para não deixar que a pessoa digite o endereço e caia na página sem se logar. Até ai tudo bem, mas quando o Tomcat invalida a sessão e eu tento executar alguma ação ocorre o seguinte erro:

28/08/2009 15:46:22 com.sun.faces.lifecycle.LifecycleImpl phase
WARNING: executePhase(PROCESS_VALIDATIONS 3,com.sun.faces.context.FacesContextImpl@4a1bda) threw exception
javax.faces.FacesException
        at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:108)
        at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        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.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
        at security.LogFilter.doFilter(LogFilter.java:36)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        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:128)
        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:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.util.NoSuchElementException
        at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:117)
        at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:144)
        at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:49)
        at javax.faces.component.UISelectOne.matchValue(UISelectOne.java:164)
        at javax.faces.component.UISelectOne.validateValue(UISelectOne.java:137)
        at javax.faces.component.UIInput.validate(UIInput.java:867)
        at javax.faces.component.UIInput.executeValidate(UIInput.java:1065)
        at javax.faces.component.UIInput.processValidators(UIInput.java:666)
        at javax.faces.component.UIForm.processValidators(UIForm.java:229)
        at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1033)
        at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:662)
        at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:100)
        ... 28 more

Utilizo o tomcat 6.0.18 e Jsf 1.2
Meu filtro é:

public class LogFilter implements Filter {

    //Pagina de login
    private static final String LOG_PAGE = "/faces/login.jsp";

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;

        if (!this.authorize((HttpServletRequest) req)) {
            request.getRequestDispatcher(LOG_PAGE).forward(req, res);
        } else {
            //Desativa o cache do browser
            //response.setHeader("Cache-Control","no-store");
            //response.setHeader("Pragma","no-cache");
            //response.setDateHeader("Expires",0);
            //Processa request e response
            chain.doFilter(req, res);
        }
    }

    public void destroy() {
    }
    //Metodo que verifica o bean em sessao se esta logado.

    private boolean authorize(HttpServletRequest req) {
        boolean retorno = false;
        HttpSession session = req.getSession(false);
        if (session != null) {
            Usuario usuario = (Usuario) session.getAttribute("userLogin");
            if (usuario != null) {
                if(usuario.isLogado())
                    retorno = true;
            }
        }
        return retorno;
    }
}

Se alguém puder ajudar....agradeço!!!

3 Respostas

rafdutra

Bom dia.

Pessoal, continuo com o mesmo problema. Tentei implementar outra solução (ao invés de usar filtro estou usando PhaseListener) mas mesmo assim continuo com o mesmo problema acima.

Alguém ai sabe o que pode ser??

gomesrod

Estranho, eu já implementei filtro de sessão expirada parecido com esse, e funcionou perfeitamente…

Você chegou a colocar algum log para se certificar que passou mesmo por ele? E pelo Phase Listener?

rafdutra

Pelo filtro não deu certo não!! Mexi, mexi, mexi e nada!

Agora eu consegui resolver pelo PhaseListener. Esse era burrada minha mesmo.
Eu tava tentando chamar um método da sessão e quando o tomcat derrubava a sessão ela ficava nula dai dava erro.

public class AuthorizationListener implements PhaseListener {

    public void afterPhase(PhaseEvent event) {
        FacesContext facesContext = event.getFacesContext();
        String currentPage = facesContext.getViewRoot().getViewId();
        boolean isLoginPage = (currentPage.lastIndexOf("login.jsp") > -1);
        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
        Object currentUser = null;

        if(session != null)
            currentUser = session.getAttribute("userLogin");


        if (!isLoginPage && currentUser == null) {
            NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
            nh.handleNavigation(facesContext, null, "loginPage");
        }
    }

    public void beforePhase(PhaseEvent event) {
    }

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

Dai coloquei esse IF na linha 10 ai e deu certo!!

Criado 28 de agosto de 2009
Ultima resposta 1 de set. de 2009
Respostas 3
Participantes 2