[Resolvido] Filter de login - JSF

Bom dia galera!

Estou criando uma página de login no meu sistema e gostaria de fazer um filter que interceptasse qualquer página xhtml e verificasse se o usuário está logado ou não.
Fiz o seguinte até agora:

Meu web.xml:

    <filter>
        <filter-name>verificaLogin</filter-name>
        <filter-class>zUtil.FiltroLogado</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>verificaLogin</filter-name>
        <url-pattern>*.xhtml</url-pattern>
    </filter-mapping>

Minha classe FiltroLogado:

public class FiltroLogado implements Filter {

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

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Entrou filtro");
        
        HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        HttpSession session = req.getSession();
        Login user = (Login) session.getAttribute("usuario_logado");
        if (user == null) {
            FacesContext fc = FacesContext.getCurrentInstance();
            ExternalContext ec = fc.getExternalContext();
            ec.redirect("index.xhtml");
        }
        
        System.out.println("Passou filtro");
    }

    @Override
    public void destroy() {
    }
}

Porém não está funcionando… coloquei um breakpoint no doFilter e não entra nunca. Alguém sabe qual pode ser o problema ?

Obrigado
:smiley:

Troque:

Por esse:

[quote=darksteel3000]Troque:

Por esse:

[/quote]

Continua sem entrar no filter :frowning:

Coloca teu web.xml todo por favor!

Qual versão do jsf está usando ?

É a 2 ?

Tente colocar:


<filter-mapping>  
    <filter-name>verificaLogin</filter-name>  
    <url-pattern>*.faces</url-pattern>  
</filter-mapping>  

[code]<?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>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>#{sessionMB.theme}</param-value>
</context-param>

&lt;servlet&gt;
    &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
    &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;*.xhtml&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;session-config&gt;
    &lt;session-timeout&gt;
        30
    &lt;/session-timeout&gt;
&lt;/session-config&gt;

&lt;welcome-file-list&gt;
    &lt;welcome-file&gt;index.xhtml&lt;/welcome-file&gt;
&lt;/welcome-file-list&gt;

&lt;filter&gt;
    &lt;filter-name&gt;verificaLogin&lt;/filter-name&gt;
    &lt;filter-class&gt;zUtil.FiltroLogado&lt;/filter-class&gt;
&lt;/filter&gt;

&lt;filter-mapping&gt;
    &lt;filter-name&gt;verificaLogin&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;

</web-app>[/code]

[quote=lele_vader]Qual versão do jsf está usando ?

É a 2 ?

Tente colocar:

[code]

verificaLogin *.faces [/code][/quote]

Sim, versão 2.
*.faces também não deu ‘-’

A classe está corretamente descrita, com o pacote todo ?

Aparentemente está correto. Aparece algum erro quando você inicia o servidor de aplicações?

Sim. o pacote zUtil está na raiz do src e dentro dele está a classe FiltroLogado.

Agora que mudei pra *.faces parece que está tentando acessar o filtro. Veja a exception:

SEVERE: WebModulePWC1270: Exception starting filter verificaLogin java.lang.ClassFormatError: Truncated class file at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:787) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at org.glassfish.web.loader.WebappClassLoader.findClass(WebappClassLoader.java:927) at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1476) at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1359) at org.apache.catalina.core.ApplicationFilterConfig.loadFilterClass(ApplicationFilterConfig.java:280) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:250) at org.apache.catalina.core.ApplicationFilterConfig.&lt;init&gt;(ApplicationFilterConfig.java:120) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4685) at org.apache.catalina.core.StandardContext.start(StandardContext.java:5377) at com.sun.enterprise.web.WebModule.start(WebModule.java:498) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:917) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:901) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:733) at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2019) at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1669) at com.sun.enterprise.web.WebApplication.start(WebApplication.java:109) at org.glassfish.internal.data.EngineRef.start(EngineRef.java:130) at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269) at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:301) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389) at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:353) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085) at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95) at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291) at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259) at org.glassfish.deployment.admin.ReDeployCommand.execute(ReDeployCommand.java:126) at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085) at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95) at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291) at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259) at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461) at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212) at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179) at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722)

Esse ultimo erro, eu acho que é porque você mapeou no seu web.xml que só irá aceitar requisições com o *.xhtml

Tenta recompilar o projeto e rodar de novo.
Estranho esse erro.

Recompilei e agora está acusando mais um erro… kkk

Além do descrito acima, ainda tem o seguinte:

SEVERE: Exception while visiting WEB-INF/classes/zUtil/FiltroLogado.class of size 0 java.lang.ArrayIndexOutOfBoundsException: 8 at org.objectweb.asm.ClassReader.readUnsignedShort(Unknown Source) at org.objectweb.asm.ClassReader.&lt;init&gt;(Unknown Source) at org.objectweb.asm.ClassReader.&lt;init&gt;(Unknown Source) at org.objectweb.asm.ClassReader.&lt;init&gt;(Unknown Source) at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:362) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:171) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:133) at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:348) at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:70) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:307) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:296) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:722)

Caramba.
Que esquisito.
Em que parte da erro.
Você está usando um servidor que suporta servlet 3 como descrito no web.xml ?

[quote=lele_vader]Caramba.
Que esquisito.
Em que parte da erro.
Você está usando um servidor que suporta servlet 3 como descrito no web.xml ?[/quote]

Estou usando Glassfish 3.1.2.2. O mesmo já utilizei em outros projetos com versão 3 sem problemas.
Quanto ao erro, ocorre no momento de iniciar a aplicação, quando cai na página de login. Se eu digitar uma url qualquer do sistema e acessar, não da mais erro mas também não tenta mais entrar no filtro.

Valeu

Não sei mais o que fazer com isso… alguma outra idéia de como eu possa fazer a validação de usuário logado ?

Realmente amigo, está muito estranho, minha ultima cartada seria ver a incompatibilidade das bibliotecas ou versões.

Mas sobre sua ultima pergunta, caso queira utilizar algo bem robusto, uma boa dica é utilizar o Spring Security, mas caso queira utilizar algo mais simples, utilize um JAAS e seja feliz.

Link para exemplo do spring security: http://javasemcafe.blogspot.com.br/2011/05/java-ee-6-seguranca-com-spring-security.html

Link para o JAAS: http://www.algaworks.com/apostilas/

Baixe a apostila da Alga Works e veja como é simples utilizar o JAAS.

[quote=darksteel3000]Realmente amigo, está muito estranho, minha ultima cartada seria ver a incompatibilidade das bibliotecas ou versões.

Mas sobre sua ultima pergunta, caso queira utilizar algo bem robusto, uma boa dica é utilizar o Spring Security, mas caso queira utilizar algo mais simples, utilize um JAAS e seja feliz.

Link para exemplo do spring security: http://javasemcafe.blogspot.com.br/2011/05/java-ee-6-seguranca-com-spring-security.html

Link para o JAAS: http://www.algaworks.com/apostilas/

Baixe a apostila da Alga Works e veja como é simples utilizar o JAAS.[/quote]

Obrigado pelos links. Vou estudar mais afundo o Spring Security.

Consegui fazer o filter funcionar… pesquisando na net sobre aquele erro que postei aqui, vi várias pessoas dizendo que a classe está corrompida quando ele acontece (só não me pergunte porque, kkk), então excluí e criei de novo meu filtro, desta vez sem mapear no web.xml, mas diretamente na classe. No fim das contas ficou assim e está funcionando:

/**
 *
 * @author jean
 */
@WebFilter(filterName = "UsuarioLogadoFilter", urlPatterns = {"/modulos/*"})
public class UsuarioLogadoFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();
        Login user = (Login) session.getAttribute("usuario_logado");
        if (user == null) {
            HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect("index.xhtml");
        } else {
            chain.doFilter(request, response);
        }
    }
}

Ele intercepta todas as requisições à pasta “modulos” que é onde eu divido o sistema (cadastros, vendas, financeiro, etc), portanto para qualquer página será feita a validação de usuário logado.

Obrigado pela força que me deram, darksteel3000 e lele_vader!

:smiley:

Ok amigo.

Muito boa a busca do conceito pelo mapeamento, bem mais simples neah?

Coloque o tópico como resolvido assim você irá ajudar a muitas outras pessoas !!! Até mais !