Filter não é executa quando chamo o meu Servlet

Pessoal,

boa tarde.

Eu possuo um Filter associado a um determinado Servlet. O problema é que o meu Servlet é executado, mais o filtro não. Abaixo segue o código do meu Filter e do web.xml:

/*

  • ControleAcesso.java
  • Created on 18 de Fevereiro de 2005, 15:11
    */

package br.com.e4w.cvrd.faleConosco.servlets.filters;

import java.io.;
import java.net.
;
import java.util.;
import java.text.
;
import javax.servlet.;
import javax.servlet.http.
;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
*

  • @author caio
  • @version
    */

public class ControleAcesso implements Filter {

private ServletContext contexto = null;

/**
 * Init method for this filter
 *
 */
public void init(FilterConfig filterConfig) {
    /*
     * Grava referência ao contexto da aplicação
     */
    contexto = filterConfig.getServletContext();
}

/**
 *
 * @param request The servlet request we are processing
 * @param result The servlet response we are creating
 * @param chain The filter chain we are processing
 *
 * @exception IOException if an input/output error occurs
 * @exception ServletException if a servlet error occurs
 */
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
    /*
     * É recuperada a sessão atual
     */
    HttpServletRequest httpRequest = (HttpServletRequest)request;
    HttpSession session = httpRequest.getSession(true);
    
    String nomePaginaRedirecionamento = null;
    
    try {
        /* 
         * Verifica se existe algum usuário logado no sistema. Esta verificação
         * é feita analisando se existe um objeto usuarioLogado no escopo da 
         * sessão. Se o objeto não existir, o fluxo será redirecionado para 
         * a servlet "IndexView".
         */

// if (session.getAttribute(“usuarioLogado”) != null) {
// nomePaginaRedirecionamento = “/Index”;
// }
nomePaginaRedirecionamento = “/scr/admUsuarios.jsp”;
} catch (Exception ex) {
nomePaginaRedirecionamento = “/scr/sistemaIndisponivel.jsp”;
System.out.println(ex.getMessage());
ex.printStackTrace();
}

    /*
     * Verifica se o fluxo será redirecionada para alguma página específica;
     */
    if (nomePaginaRedirecionamento != null) {
        request.getRequestDispatcher(nomePaginaRedirecionamento).forward(request, response);
    }
     
    chain.doFilter(request, response); 
}


/**
 * Destroy method for this filter
 *
 */
public void destroy() {
    /* Ajuda ao GarbageCollecition a eliminar os objetos criados neste servlet
     * de filtro.
     */
    contexto = null;
}

}


ARQUIVO web.XML

<?xml version=“1.0” encoding=“UTF-8”?>
<web-app xmlns=“http://java.sun.com/xml/ns/j2ee” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=“http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd” version=“2.4”>
<filter>
<filter-name>ControleAcesso</filter-name>
<filter-class>br.com.e4w.cvrd.faleConosco.servlets.filters.ControleAcesso</filter-class>
</filter>
<filter-mapping>
<filter-name>ControleAcesso</filter-name>
<servlet-name>GerenciaMensagemView</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>ControleAcesso</filter-name>
<servlet-name>DaoSecao</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>DaoSecao</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.DaoSecao</servlet-class>
</servlet>
<servlet>
<servlet-name>DaoUsuarios</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.DaoUsuarios</servlet-class>
</servlet>
<servlet>
<servlet-name>DaoCategorias</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.DaoCategorias</servlet-class>
</servlet>
<servlet>
<servlet-name>DaoPerguntas</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.DaoPerguntas</servlet-class>
</servlet>
<servlet>
<servlet-name>DaoBaseConhecimento</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.DaoBaseConhecimento</servlet-class>
</servlet>
<servlet>
<servlet-name>EnviaMensagem</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.servlets.EnviaMensagem</servlet-class>
</servlet>
<servlet>
<servlet-name>FaleConoscoView</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.servlets.FaleConoscoView</servlet-class>
</servlet>
<servlet>
<servlet-name>Autenticacao</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.servlets.Autenticacao</servlet-class>
</servlet>
<servlet>
<servlet-name>IndexView</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.servlets.IndexView</servlet-class>
</servlet>
<servlet>
<servlet-name>ControleSessao</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.servlets.ControleSessao</servlet-class>
</servlet>
<servlet>
<servlet-name>GerenciaMensagemView</servlet-name>
<servlet-class>br.com.e4w.cvrd.faleConosco.servlets.GerenciaMensagemView</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DaoSecao</servlet-name>
<url-pattern>/servlet/DaoSecao</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DaoUsuarios</servlet-name>
<url-pattern>/servlet/DaoUsuarios</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DaoCategorias</servlet-name>
<url-pattern>/DaoCategorias</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DaoPerguntas</servlet-name>
<url-pattern>/DaoPerguntas</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DaoBaseConhecimento</servlet-name>
<url-pattern>/servlet/DaoBaseConhecimento</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>EnviaMensagem</servlet-name>
<url-pattern>/EnviaMensagem</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FaleConoscoView</servlet-name>
<url-pattern>/FaleConoscoView</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Autenticacao</servlet-name>
<url-pattern>/Autenticacao</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>IndexView</servlet-name>
<url-pattern>/Index</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ControleSessao</servlet-name>
<url-pattern>/ControleSessao</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>GerenciaMensagemView</servlet-name>
<url-pattern>/GerenciaMensagem</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>
Index
</welcome-file>
<welcome-file>
index.html
</welcome-file>
<welcome-file>
index.htm
</welcome-file>
</welcome-file-list>
<resource-ref>
<res-ref-name>faleConoscoDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>


Alguém saberia dizer o que estou fazendo de errado? Desde já agradeço pela ajuda.

Salve,

cara o erro está na seguinte linha:

private ServletContext contexto = null; ... contexto = filterConfig.getServletContext&#40;&#41;;

você deve substituir por:

private FilterConfig contexto = null;
...
contexto = filterConfig;

Porque quando o contentor chama o método init você deve declarar a uma variável FilterConfig para que ela fique disponível para os outros métodos. :idea: :idea:

Obrigado pela resposta MarcosSouza, mais isto não resolveu o problema.

Analisando com mais causa, descobri o que era. Na verdade o servlet que eu estava mapeando para ser filtrado não estava sendo chamado diretamente pelo browser. Eu reencaminhava para ele dentro de um outro servlet, através do seguinte comando:

request.getRequestDispatcher("/GerenciaMensagem").forward(request, response);

Desta forma, o filtro não conseguia identificar. Sò quando eu passava diretamente pela url.

Acredito que a forma para repassar a requisição de uma Servlet para outra é que deve estar mal formatada. Se você souber algo a respeito, ficarei grato.

Salve,

bem, vamos tentar redirecionar este servlet de outra forma. Tente de outra forma, o metodo sendRedirect é um chamada completa:

response.sendRedirect(“seuServlet”);

Obrigado pela dica Marcos.

Fiz um teste aqui e funcionou. :grin:

Saberia me dizer se este método de chamada de servlet, página tem alguma desvantagem em relação ao que eu utilizava?

Pensando bem, cada método tem sua vantagem:

O método “request.getRequestDispatcher(”/GerenciaMensagem").forward(request, response);" é bom utilizar quando for chamar páginas jsp, pois ele mascara para o usuário esta chamada. O mesmo continua vendo a url que digitou na chamada.

Já o método “response.sendRedirect(“seuServlet”);” é bom utilizar quando for redirecionar para um outro Servlet, pois os Filters serão executados normalmente, e o seu nome aparecerá no local para o digitar o endereço do browser.

Mais uma vez valeu pela dica. Me ajudou bastante. :wink:

mas da pra aplicar filtro no dispatcher tb…

Salve,

Cara, o sendRedirect é um pouco mais lento que o getRequestDispatcher uma vez que o processo de solicitação/resposta é feito completamente, ou seja, quanto você chama o sendRedirect ele envia um resposta ao navegador e este envia novamente uma solicitação com a url que você colocou.

Até mais!
:idea: :idea: :wink: