Filtros para servlets

em 04/09/2002 , por Cesar Olmos
Introdução
Para este tutorial, é necessário que você tenha um Servlet Container como o Apache Tomcat instalado e funcionando corretamente. Recomenda-se que você já tenha alguma experiência com Servlets. A maioria de nós já escreveu Servlets que se comportam como fitros, fazendo controle de acesso, geração de logs, compactação de dados, e coisas desse tipo. Utlizando filtros conseguimos separar de forma mais clara essas tarefas do resto da aplicação, além de podemos criar filtros genéricos, facilmente "plugáveis", e que poderão ser utilizados em outros lugares sem a necessidade de se alterar nenhuma linha de código. Eles foram introduzidos na API 2.3 de Servlet que está disponível a partir do Tomcat versão 4.0.4.
Uma visão geral
Um filtro é um objeto que implementa a clase javax.servlet.Filter e por isso deve definir três métodos:

O método init é chamado uma vez antes do filtro entrar em operação pela primeira vez. Como parâmetro é passado um FilterConfig de onde se pode obter o nome do filtro, os parâmetros de inicialização, e o ServletContext. O método destroy é chamado para avisar o filtro que ele está sendo desativado, e possa liberar eventuais recursos alocados. O método doFilter é onde é feito todo o processamento do filtro. A sua estrutura básica é a seguinte:

Aqui podemos ver claramente como o doFilter deve se comportar. A primeira parte é executada antes de que o Servlet seja executado. Então, a chamada chain.doFilter transfere o controle para o próximo filtro. A chamada só retorna quando o Servlet já foi processado, e todo só aí o código posterior a essa chamada será executado. Como ao chamarmos chaind.doFilter passamos como parâmetro um request e um response, podemos facilmente alterá-los, criando Wrappers em torno de cada um deles. Vamos agora ver um exemplo de um filtro bem simples...
Um filtro simples


Esse Servlet bastante simples gera um log do tempo que cada requisição levou. Para ter acesso ao log do Tomcat é preciso guardar o ServletContext, o que é feito no método init. Vale ressaltar também que o request recebido pelo filtro não é um HttpServletRequest, e portanto para conseguirmos a URI utilizada para chamar o Servlet precisamos de um cast. Falta agora instalar esse filtro na aplicação. Para isso precisamos declará-lo no arquivo web.xml, através da tag :

Isso informa ao servidor que o filtro timerFilter é implementado pela classe TimerFilter. Precisamos agora mapear para que tipos de URL desejamos aplicar esse filtro. Isso é feito através da tag da seguinte forma:

Isso mapeia o filtro timerFilter para todas as URLs que comecem com my_servlet.
Considerações finais
O exemplo usado nesse tutorial é um exemplo bastante simples, mas que permite perceber o quanto poderosa é essa API. É importante ressaltar que podemos plugar e remover filtros sem que os Servlets fiquem sabendo disso , o que nos dá uma grande flexibilidade. Uma coisa com a qual devemos sempre tomar cuidado é que um filtro não é um Servlet, e portanto não deve ser responsável por gerar nenhum tipo de conteúdo, ele deve apenas filtrar os dados que passam por ele. Alguns bons exemplos de filtros podem ser encontrados em http://java.sun.com/products/servlet/Filters.html. A partir daqui é com você, boa sorte.