Filtro de Servlets (Servlets Filters)

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

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

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.

 

2 Respostas

  1. Sensacionais todos os posts sobre Servlets. Gostei demais, Ythalo. Parabéns.

  2. [...] Filtro de Servlets (Servlets Filters) julho, 2009 1 comentário 4 [...]

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 233 other followers