Hospedagem Profissional

Hospedagem Profissional
Clique aqui e ganhe US$ 10,00 para testar durante 1 mês a melhor hospedagem: Digital Ocean!

quarta-feira, 22 de outubro de 2008

Filtros para servlets

Como utilizar os filtros para reaproveitar mais o seu código, e manter suas servlets mais organizadas.

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. 


Um filtro é um objeto que implementa a clase javax.servlet.Filter e por isso deve definir três métodos: 

1     void init(FilterConfig configthrows ServletException
2     void destroy()
3     void doFilter(ServletRequest req, ServletResponse res, FilterChain chainthrows IOException, ServletException


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 oServletContext

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: 

1     void doFilter(ServletRequest req, ServletResponse res, FilterChain chainthrows IOException, ServletException {
2         //essa parte é executada antes do request chegar ao Servlet
3         chain.doFilter(request, response);
4         //essa parte é executada depois que o response já foi gerado pelo Servlet
5     }


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... 


01 import java.io.*;
02 import javax.servlet.*;
03 import javax.servlet.http.*;
04 
05 public class TimerFilter implements Filter {
06 
07     private ServletContext context = null;
08 
09     public void init(FilterConfig configthrows ServletException {
10         this.context = config.getServletContext();
11     }
12 
13     public void destroy() {
14         config = null;
15     }
16 
17     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain
18         throws IOException, ServletException {
19 
20         long inicio = System.currentTimeMillis();
21         chain.doFilter(request, response);
22         long fim = System.currentTimeMillis();
23 
24         String nome = "";
25         if (request instanceof HttpServletRequest) {
26             nome = ((HttpServletRequest)request).getRequestURI();
27         }
28         context.log(nome + ": " (fim - inicio"ms");
29     }
30 }


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 

     
        timerFilter 
        TimerFilter 
    
 


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: 

     
        timerFilter 
        /my_servlet 
    
 


Isso mapeia o filtro timerFilter para todas as URLs que comecem com my_servlet


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 emhttp://java.sun.com/products/servlet/Filters.html

A partir daqui é com você, boa sorte. 

Cesar Olmos 
Fonte : http://www.guj.com.br/java.tutorial.artigo.11.1.guj