JSP - Filtros

Neste capítulo, discutiremos Filtros em JSP. Filtros Servlet e JSP são classes Java que podem ser usadas na Programação Servlet e JSP para os seguintes propósitos -

  • Para interceptar solicitações de um cliente antes que eles acessem um recurso no back end.

  • Para manipular as respostas do servidor antes de serem enviadas de volta ao cliente.

Existem vários tipos de filtros sugeridos pelas especificações -

  • Filtros de autenticação
  • Filtros de compressão de dados
  • Filtros de criptografia
  • Filtros que acionam eventos de acesso a recursos
  • Filtros de conversão de imagem
  • Filtros de registro e auditoria
  • Filtros de cadeia MIME-TYPE
  • Filtros de tokenização
  • Filtros XSL / T que transformam conteúdo XML

Os filtros são implantados no arquivo descritor de implantação web.xmle, em seguida, mapeie para nomes de servlet ou JSP ou padrões de URL no descritor de implementação de seu aplicativo. O arquivo descritor de implantação web.xml pode ser encontrado no diretório <Tomcat-installation-directory> \ conf .

Quando o contêiner JSP inicia seu aplicativo da web, ele cria uma instância de cada filtro que você declarou no descritor de implementação. Os filtros são executados na ordem em que são declarados no descritor de implantação.

Métodos de filtro de servlet

Um filtro é simplesmente uma classe Java que implementa o javax.servlet.Filterinterface. A interface javax.servlet.Filter define três métodos -

S.No. Método e Descrição
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

Este método é chamado pelo contêiner sempre que um par de solicitação / resposta é passado pela cadeia devido a uma solicitação do cliente por um recurso no final da cadeia.

2

public void init(FilterConfig filterConfig)

Este método é chamado pelo contêiner da web para indicar a um filtro que ele está sendo colocado em serviço.

3

public void destroy()

Este método é chamado pelo contêiner da web para indicar a um filtro que ele está sendo retirado de serviço.

Exemplo de filtro JSP

O exemplo a seguir mostra como imprimir o endereço IP do cliente e a data e hora atual, cada vez que acessaria qualquer arquivo JSP. Este exemplo lhe dará uma compreensão básica do Filtro JSP, mas você pode escrever aplicativos de filtro mais sofisticados usando o mesmo conceito -

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
 
// Implements Filter class
public class LogFilter implements Filter  {
   public void  init(FilterConfig config) throws ServletException {
      // Get init parameter 
      String testParam = config.getInitParameter("test-param"); 
 
      //Print the init parameter 
      System.out.println("Test Param: " + testParam); 
   }
   public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws java.io.IOException, ServletException {
      
      // Get the IP address of client machine.   
      String ipAddress = request.getRemoteAddr();
      
      // Log the IP address and current timestamp.
      System.out.println("IP "+ ipAddress + ", Time "+ new Date().toString());
      
      // Pass request back down the filter chain
      chain.doFilter(request,response);
   }
   public void destroy( ) {
      /* Called before the Filter instance is removed 
      from service by the web container*/
   }
}

Compilar LogFilter.java da maneira usual e coloque o seu LogFilter.class arquivo em <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.

Mapeamento de filtro JSP em Web.xml

Os filtros são definidos e, em seguida, mapeados para um URL ou nome de arquivo JSP, da mesma forma que o Servlet é definido e, em seguida, mapeado para um padrão de URL em web.xmlArquivo. Crie a seguinte entrada para a tag de filtro no arquivo descritor de implantaçãoweb.xml

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

O filtro acima será aplicado a todos os servlets e JSP porque especificamos /*em nossa configuração. Você pode especificar um servlet específico ou o caminho JSP se quiser aplicar o filtro em alguns servlets ou apenas JSP.

Agora tente chamar qualquer servlet ou JSP e você verá o log gerado no log do seu servidor web. Você pode usarLog4J logger para fazer o login acima, faça o login em um arquivo separado.

Usando vários filtros

Seu aplicativo da web pode definir vários filtros diferentes com uma finalidade específica. Considere, você define dois filtros AuthenFilter e LogFilter . O resto do processo permanecerá conforme explicado acima, exceto que você precisa criar um mapeamento diferente conforme mencionado abaixo -

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>LogFilter</filter-class>
   
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>
 
<filter>
   <filter-name>AuthenFilter</filter-name>
   <filter-class>AuthenFilter</filter-class>
   <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
   </init-param>
</filter>
 
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
 
<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Ordem de aplicação de filtros

A ordem dos elementos de mapeamento de filtro em web.xml determina a ordem em que o contêiner da web aplica o filtro ao servlet ou JSP. Para inverter a ordem do filtro, você só precisa reverter os elementos de mapeamento do filtro noweb.xml Arquivo.

Por exemplo, o exemplo acima aplicará o LogFilter primeiro e, em seguida, aplicará AuthenFilter a qualquer servlet ou JSP; o exemplo a seguir inverterá a ordem -

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
 
<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>