Java Servlet Filter (Adaptação para português) - Filtros de Requisição no Java
Autor: Felipe Caparelli | Publicado: 2010-02-01T18:42:00-02:00

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 &amp; Tomcat bem interessante em inglês. Resolvi traduzir o artigo e adicionar algumas considerações e dicas que achei pertinentes (ágeis):

<span style="background-color: white;" title="Servlet Filters are the latest components 
that are added in Servlet 2.3 specifications.">Servlet Filters são os  últimos componentes adicionados às <span style="background-color: white;" title="Servlet Filters are the latest components 
that are added in Servlet 2.3 specifications.">especificações<span style="background-color: white;" title="Servlet Filters are the latest components 
that are added in Servlet 2.3 specifications."> Servlet 2.3. <span style="background-color: white;" title="These filters are 
used basically for intercepting and modifying requests and response from
 server.">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). <span style="background-color: white;" title="Consider a scenario
 where you want to check session from the every users request and if it 
is valid then only you want to let the user access the page.">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. <span style="background-color: white;" title="You can acheive this by checking sessions on all the 
servlet pages (or JSP pages) which users queries or you can do this by 
using Filter.">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).
<span style="background-color: white;" title="Let us create a 
Servlet Filter that just prints the clients ip address and date time.">Vamos  criar um filtro servlet que apenas imprime o endereço IP de Clientes e a data, <span title="This is just to log users who are 
accessing the application.">apenas para registrar os usuários que  estão acessando a aplicação.
<span style="background-color: white;" title="We we use Eclipse 
for developing our application and Apache Tomcat for deploying and 
running our application.">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.<span style="background-color: white;" title="Starts eclipse and create a new dynamic web 
project with name ServletFilterProject.">Inicie o eclipse e crie um  novo projeto web dinâmico com o nome ServletFilterProject. <span style="background-color: white;" title="Select Target 
runtime environment.">Selecione o ambiente Target Runtime. <span style="background-color: white;" title="I have selected 
Apache Tomcat v6.0, you can select any Tomcat version that you have 
installed.">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.<span style="background-color: white;" title="Step 2: Create package &amp; Servlet Filter 
class.">Etapa 2: Criar pacote e classe Servlet Filter.<span style="background-color: white;" title="Starts eclipse and create a new dynamic web 
project with name ServletFilterProject.">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. <span style="background-color: white;" title="Starts eclipse and create a new dynamic web 
project with name ServletFilterProject.">* 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<span style="background-color: white;" title="Starts eclipse and create a new dynamic web 
project with name ServletFilterProject."> <span style="background-color: white;" title="Starts eclipse and create a new dynamic web 
project with name ServletFilterProject.">mapeamento da mesma no nosso arquivo web.xml&nbsp;
Next &gt; Next &gt; 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 {

&nbsp;&nbsp;&nbsp; public LogFilter() {
&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; public void destroy() {
&nbsp;&nbsp;&nbsp; }

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

}
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:
&nbsp;&nbsp;&nbsp;&nbsp; public void doFilter(ServletRequest  request, ServletResponse response,
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FilterChain chain) throws  IOException, ServletException {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest req = (HttpServletRequest)&nbsp; request;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Pega o endereço IP da máquina do cliente.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String ipAddress = req.getRemoteAddr();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Loga o endereço&nbsp; IP e o horário atual.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("IP "+ipAddress + ", Time " + new Date().toString());

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chain.doFilter(request, response);
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; public void init(FilterConfig fConfig) throws  ServletException {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Pega os parametros iniciais&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String testParam = config.getInitParameter("test-param");
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //Imprime os  parametros iniciais&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Test Param: " + testParam);&nbsp;
&nbsp;&nbsp;&nbsp; }

}
<span style="background-color: white;" title="In this filter example, we have implemented 
an interface javax.servlet.Filter and override its methods init, 
doFilter and destroy.">Neste exemplo de filtro, implementamos a  interface javax.servlet.Filter e substituimos os métodos init, doFilter e  destroy.
<span style="background-color: white;" title="The init() method is used to initialize any code that is 
used by Filter.">O método init () é usado para inicializar qualquer  código que é usado pelo filtro. <span style="background-color: white;" title="Also note that, init() method will get an 
object of FilterConfig which contains different Filter level information
 as well as init parameters which is passed from Web.xml (Deployment 
descriptor).">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).
<span style="background-color: white;" title="The doFilter() method will do the actual logging of 
information.">O método doFilter () é quem realmente fará o registro das  informações. <span style="background-color: white;" title="You can modify this method and add your code which can modify 
request/session/response, add any attribute in request etc.">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.
<span style="background-color: white;" title="The destroy() 
method is called by the container when it wants to garbage collect the 
filter.">O método destroy () é chamado pelo container quando quer  recolher lixo do filtro. <span style="background-color: white;" title="This is usually done when filter is not used for long
 time and server wants to allocate memory for other applications.">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.<span style="background-color: white;" title="This is usually done when filter is not used for long
 time and server wants to allocate memory for other applications.">
<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">Etapa 4: Criar o mapenamento do Servlet Filter no web.xml (não é necessário)
<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">Como o Eclipse já fez esse favor pra nós vou apenas exibir o conteúdo gerado:<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">&nbsp; &lt;filter&gt;
&nbsp;&nbsp;&nbsp; &lt;display-name&gt;LogFilter&lt;<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">/<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">display-name&gt;
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;LogFilter&lt;<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">/<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">filter-name&gt;
&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;net.viralpatel.servlet.filters.LogFilter&lt;<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">/<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">filter-class&gt;
&nbsp; &lt;/filter&gt;
&nbsp; &lt;filter-mapping&gt;
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;LogFilter&lt;<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">/<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">filter-name&gt;
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/LogFilter&lt;<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">/<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">url-pattern&gt;
&nbsp; &lt;<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">/<span style="background-color: white;" title="Step 4: Create Servlet Filter Mapping in 
Web.xml">filter-mapping&gt;&nbsp; Para ver o arquivo web.xml gerado acesse em seu projeto a pasta WebContent/WEB-INF
Etapa 5:  Executando a aplicação Web
<span style="background-color: white;" title="We are done with the coding part of Servlet 
Filter example.">Finalizamos a parte da codificação do exemplo de  Servlet Filter. <span style="background-color: white;" title="Now execute the project by Run -&gt; Run As -&gt; Run on 
server (shortcut Alt+Shift+X, R).">Agora execute o projeto no Eclipse:<span style="background-color: white;" title="Now execute the project by Run -&gt; Run As -&gt; Run on 
server (shortcut Alt+Shift+X, R).">Acesse no menu Run -&gt;  Run As -&gt; Run on server (atalho Alt + Shift + X, R).<span style="background-color: white;" title="Check the console 
you will see the output that we print using System.out.">Verifique o  console e você verá na saída a impressão gerada pelo System.out.<span title="Change the code in the way you 
want your filter to work."> 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.<span title="Change the code in the way you 
want your filter to work.">
<span title="Change the code in the way you 
want your filter to work.">* 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.<span title="Change the code in the way you 
want your filter to work.">
<span title="Change the code in the way you 
want your filter to work.">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.

<span style="background-color: white;" title="Starts eclipse and create a new dynamic web 
project with name ServletFilterProject.">&nbsp;