Filter não é executa quando chamo o meu Servlet

7 respostas
C

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 <a href="http://java.io">java.io</a>.<em>;

import <a href="http://java.net">java.net</a>.</em>;

import java.util.<em>;

import java.text.</em>;

import javax.servlet.<em>;

import javax.servlet.http.</em>;
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=“<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> xmlns:xsi=“<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a> xsi:schemaLocation=“<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a> 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.

7 Respostas

M

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:

C

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.

M

Salve,

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

response.sendRedirect(“seuServlet”);

C

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?

C

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:

M

mas da pra aplicar filtro no dispatcher tb…

M

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:

Criado 18 de fevereiro de 2005
Ultima resposta 22 de fev. de 2005
Respostas 7
Participantes 3