Java Servlet Filter (Adaptação para português) - Filtros de Requisição no Java

Estive pesquisando sobre o que são Filters (Filtros) de requisição e encontrei um artigo da autoria de ViralPatel.net, post: Java Servlet Filter tutorial example using Eclipse & Tomcat bem interessante em inglês. Resolvi traduzir o artigo e adicionar algumas considerações e dicas que achei pertinentes (ágeis):

Servlet Filters são os últimos componentes adicionados às especificações Servlet 2.3. Estes filtros são utilizados basicamente para interceptar e modificar pedidos e resposta do servidor (entenda interceptar por: entrar no meio do caminho e poder executar algum código). Considere um cenário em que você deseja validar a sessão a cada solicitação dos usuários e somente se for valida você quer deixar o usuário acesse a página. Você pode conseguir isso verificando sessões em todas as páginas do servlet (ou páginas JSP) que os usuários consultem ou acessem ou você pode fazer isso usando filtros (filters).
Vamos criar um filtro servlet que apenas imprime o endereço IP de Clientes e a data, apenas para registrar os usuários que estão acessando a aplicação.
Usaremos o IDE Eclipse para o desenvolvimento de nossa aplicação e Apache Tomcat (servlet container) para implementar e executar nossa aplicação.

Etapa 1: Criar um projeto web dinâmico (dynamic web project) no Eclipse.

Inicie o eclipse e crie um novo projeto web dinâmico com o nome ServletFilterProject. Selecione o ambiente Target Runtime. Selecionei o Apache Tomcat v6.0, mas você pode escolher qualquer versão do Tomcat que tenha instalado em sua máquina. Clique em Concluir.

Etapa 2: Criar pacote e classe Servlet Filter.

Crie um pacote para Servlet Filters na sua pasta de origem do projeto. Eu criei o pacote net.viralpatel.servlet.filters. Dentro do pacote, crie uma classe Java chamada LogFilter.java. * Neste ponto gostaria de adicionar algo mais prático: o eclipse padrão que baixamos no site oficial vem com alguns puglins interessantes e um deles permite criar Servlet Filter de forma mais fácil e rápida. Na perpectiva Java EE temos a opção de adicionar filtros ao projeto e ao criá-lo, o mesmo já cria a classe filter, que daremos o nome de LogFilter, e ainda faz o mapeamento da mesma no nosso arquivo web.xml

 

Next > Next > Finish e abaixo segue o código gerado pelo Eclipse (sem a documentação):
package net.viralpatel.servlet.filters;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LogFilter implements Filter {

    public LogFilter() {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
       
        chain.doFilter(request, response);
    }
   
    public void init(FilterConfig fConfig) throws ServletException {
       
    }

}

Etapa 3: Escrevendo o código da nossa classe Servlet Filter.

Vamos modificar o método doFilter e o método init para que possamos executar nossa lógica:

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

         HttpServletRequest req = (HttpServletRequest) 
request;        
         //Pega o endereço IP da máquina do cliente.         String ipAddress = req.getRemoteAddr();        
         //Loga o endereço  IP e o horário atual.         System.out.println("IP "+ipAddress + ", Time " + new Date().toString());

         chain.doFilter(request, response);
    }
   
    public void init(FilterConfig fConfig) throws ServletException {

        //Pega os parametros iniciais
        String testParam = config.getInitParameter("test-param");
     
        //Imprime os parametros iniciais        System.out.println("Test Param: " + testParam);
 
    }

}

Neste exemplo de filtro, implementamos a interface javax.servlet.Filter e substituimos os métodos init, doFilter e destroy.
O método init () é usado para inicializar qualquer código que é usado pelo filtro. Observe também que, o método init () irá receber um objeto de filterConfig que contém informações de diferentes níveis de filtro, bem como parâmetros de inicialização que são passadas ao web.xml (deployment descriptor).
O método doFilter () é quem realmente fará o registro das informações. Você pode modificar esse método e adicionar o seu código, que pode modificar request / sessão / resposta, adicione algum atributo no pedido, etc.
O método destroy () é chamado pelo container quando quer recolher lixo do filtro. Isso geralmente é feito quando o filtro não for usada por muito tempo e servidor quer alocar memória para outras aplicações. Hehehehe, aqui não fizemos nada.

Etapa 4: Criar o mapenamento do Servlet Filter no web.xml (não é necessário)

Como o Eclipse já fez esse favor pra nós vou apenas exibir o conteúdo gerado:
  <filter>
    <display-name>LogFilter<
/display-name>
    <filter-name>LogFilter<
/filter-name>
    <filter-class>net.viralpatel.servlet.filters.LogFilter<
/filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LogFilter<
/filter-name>
    <url-pattern>/LogFilter<
/url-pattern>
  <
/filter-mapping
Para ver o arquivo web.xml gerado acesse em seu projeto a pasta WebContent/WEB-INF

Etapa 5: Executando a aplicação Web

Finalizamos a parte da codificação do exemplo de Servlet Filter. Agora execute o projeto no Eclipse:
Acesse no menu Run -> Run As -> Run on server (atalho Alt + Shift + X, R).Verifique o console e você verá na saída a impressão gerada pelo System.out. Altere o código da maneira que você quiser e veja o trabalho que seu filtro realiza. O filtro é muito interessante para executarmos tarefas de verificação de usuário, carregar listas com dados eliminando assim o uso de scriptlet nas nossas JSPs, etc.

* Neste exemplo eliminamos a escrita básica do Filter, bem como seu mapeamento no web.xml, tudo isso graças ao puglin do Eclipse. Também é possível executar muitas outras tarefas corriqueiras como essa através desses atalhos de puglins do Eclipse tornando nosso trabalho muito mais ágil e focado na lógica de negócios, que é o que mais importa em nossas aplicações.

Espero que tenham gostado deste artigo assim como eu gostei e que ele venha a ser útil para aqueles que estão iniciando seu aprendizado nas requisições dos aplicativos web em Java.


 

Comentários