FILTROS

   

Em sistemas webs alguns tipos de usuários não podem acessar certas partes do site. Por exemplo, uma pessoa que vai comprar algum item online não pode ter capacidade de alterar o estoque do site. Uma forma de fazer esse controle de acesso é usando os filtros da API Servlet. Um filtro também pode ser útil para fazer tratamento de erros, medir tempo de execução e fazer uma conexão com o banco de dados a cada requisição.

 
 

Por definição uma classe que implementa javax.servlet.Filter deve implementar 3 métodos:

   void init(FilterConfig config) throws ServletException
 
   void destroy()
 
   void doFilter(ServletRequest re, ServletResponse res, FilterChain chain) 
     throws IOException, ServletException
 

O método init é chamado antes do filtro ser executado pela primeira vez. O método destroy é chamado quando o filtro está sendo desativado. E o método doFilter é onde será feito todo o processo em cima do filtro. Esse é um comportamento poderoso e útil nos Filtros. Ele permite que você execute o código antes da requisição e também depois da resposta.

 

O primeiro passo para começar a mexer com filtros, é configurar o web.xml:

<filter>
  <filter-name>tempo</filter-name>
  <filter-class> br.ucb.filtro.TempoExecucao </filter-class>
</filter>

<filter-mapping>
  <filter-name>tempo</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
 
<filter-name>: Nome que o seu filtro receberá
<filter-class>: Caminho de onde a classe que o implementa se encontra
<url-pattern>: Define qual tipo de requisição o filtro será aplicado (se fosse colocado .jsp, apenas requisições jsp seriam processadas pelo filtro)

 

Crie uma página JSP simples, e digite o formulário abaixo:

<form action = "tempo">
	<input type="submit" value="Enviar">
</form>
 

Logo em seguida analise a classe a seguir e crie ela em seu projeto.

package br.ucb.filtro;

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;
import javax.servlet.http.HttpServletRequest;

public class TempoExecucao implements Filter{

	@Override
	public void destroy() {
		
	}

	public void doFilter(ServletRequest request, 
	        ServletResponse response, FilterChain chain)
	        throws IOException, ServletException {

	    long inicial = System.currentTimeMillis();

	    chain.doFilter(request, response);

	    long tempoFinal = System.currentTimeMillis();
	    
	    String uri = ((HttpServletRequest)request).getRequestURI();  
	    
	    System.out.println("Tempo da requisição de " +  uri + " 
		   demourou (ms): " + (tempoFinal - inicial));
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		
	}

}
 

A classe TempoExecução irá calcular o tempo que uma requisição levou para ser processada. Quando você for rodar a aplicação, a página não irá para lugar algum, apenas dará um erro 404, mas veja a console do Eclipse, lá estará o que você fez na classe. Essa é apenas uma das utilidades do filtro.

 

Atividade de Fixação

 

No intuito de fixar a aprendizagem iniciada por meio deste módulo e verificar como seu entendimento sobre este conteúdo está, estão sendo sugeridos alguns exercícios de fixação para serem resolvidos. Clique no link de exercícios ao lado, pois será por meio dele iniciada a lista de exercícios sobre os conteúdos estudados até este momento nesta disciplina.