Como utilizar os filtros para reaproveitar mais o seu código, e manter suas servlets mais organizadas.
Introdução
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 config) throws 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 chain) throws IOException, ServletException { |
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.*; |
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.
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
Nenhum comentário:
Postar um comentário
Comentários sobre assuntos não relacionados ao objetivo deste blog serão removidos.