Tecnicamente falando, filtro é um objeto que intercepta uma mensagem de requisição entre a origem/cliente e destino/recurso.
Como funciona?
Associando a origem ao browser/navegador, o destino a um servlet e uma implementação de HttpServletRequest a mensagem de requisiçao é possível interceptar estas requisições através de um filtro.
A mensagem antes de chegar ao servlet é recepcionada/interceptada por um filtro que aplica alguma regra de negocio da aplicação e permite ou não o acesso ao servlet. Caso o acesso seja concebido a mensagem chegará ate o servlet e será processada, ao terminar o processo o servlet responde (HttpServletResponse), a resposta passará novamente pelo filtro antes de chegar ao cliente/origem.

Exemplo de Filtro Simples
Encadeando
É possível encadear vários filtros, por exemplo, supondo que é necessário verificar se um cliente esta autenticado (AutenticadoFiltro) e se tem permissão (PermissãoFiltro) para acessar determinado recurso. Desta forma ao acessar o recurso o filtro AutenticadoFiltro é executado, logo em seguida o PermisãoFiltro é executado, caso o acesso seja concebido o recurso é acessado e processado, quando uma resposta estiver voltando para o cliente, os filtros serão acessados de forma contraria, desta vez o PermisãoFiltro será executado primeiro e logo em seguinda o AunteticadoFiltro.

Exemplo de Filtro Encadeado
Filtros podem ser utilizados para diversas funcionalidades, tais como: Autenticação, Log, conversão de imagens, compressão de dados, criptografia, dentre outros.
Filtro em ação
import java.io.*;
import javax.servlet.*;public class YRossFilter implements Filter {
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig){
this.filterConfig = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
PrintWriter pw = response.getWriter();
pw.println(“<html>”);
pw.println(“<head>”);
pw.println(“</head>”);
pw.println(“<body>”);
pw.println(“<h3>YRoss Filter!</h3>”);
pw.println(“</body>”);
pw.println(“</html>”);
pw.flush();
}
public void destroy() { }
}
No exemplo anterior o filtro apenas retorna uma mensagem para o browser/origem utilizando o ServletResponse. É importante resaltar
Implantando o Filtro
É necessário algumas tags no descritor de implantação (web.xml) para que os filtros possam interagir com as requisições e respostas. Segue como deve ficar as tags:
<web-app>
…
<filter>
<filter-name>YRossFilter</filter-name>
<filter-class>br.com.yross.filters.YRossFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>YRossFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
…
</web-app>
Onde:
<filter>: Tag que define o filtro.
<filter-name>: Nome representativo para o filtro.
<filter-class>: Classe que implementa a interface javax.servlet.Filter.
<filter-mapping>: Tag que define os mapeamentos para as requisições que devem passar pelo filtro.
<filter-name>: Nome representativo do filtro que deve interceptar a requisição.
<url-pattern>: URI que será filtrada.
Uma observação deve ser feita aqui, o <filter-mapping> pode ser utilizado para mapear todas as requisições para um determinado servlet, para isso é necessário a utilização da tag <servlet-name>. Se usado em conjunto com <url-pattern>, a tag <url-mapping> terá prioridade sobre a <servlet-name>.
Algumas observações
- Existe apenas um filtro para cada tag <filter> no descritor de implantação (web.xml), por maquina virtual.
- É possível encaminhar e incluir recursos utilizando RequestDispatcher.forward() e RequestDispatcher.include(), respectivamente.
- Retorna páginas de erro.
- Pontos de execução são controlados dentro do mapeamento de filtros dentro do web.xml, como segue abaixo:
<filter-mapping>
<filter-name>YRossFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
Neste exemplo os pontos de ação dos filtros serão as requisições (REQUEST), encaminhamentos (FORWARD), includes (INCLUDE) ou páginas de erro (ERROR). Se nenhum ponto de ação for especificado o REQUEST será o padrão.
Arquivado em: Certificações, Java, JEE, SCWCD Etiquetado: | ERROR, filter, filter-name, FORWARD, javax.servlet.Filter, Request, REQUIRED, response, Servlet, url-pattern
Sensacionais todos os posts sobre Servlets. Gostei demais, Ythalo. Parabéns.
[...] Filtro de Servlets (Servlets Filters) julho, 2009 1 comentário 4 [...]