JSP - Filtros

En este capítulo, analizaremos los filtros en JSP. Los filtros de servlet y JSP son clases de Java que se pueden utilizar en la programación de servlet y JSP para los siguientes propósitos:

  • Para interceptar solicitudes de un cliente antes de que accedan a un recurso en el back-end.

  • Para manipular las respuestas del servidor antes de que se envíen de vuelta al cliente.

Hay varios tipos de filtros sugeridos por las especificaciones:

  • Filtros de autenticación
  • Filtros de compresión de datos
  • Filtros de cifrado
  • Filtros que desencadenan eventos de acceso a recursos
  • Filtros de conversión de imágenes
  • Filtros de registro y auditoría
  • Filtros de cadena TIPO MIME
  • Filtros de tokenización
  • Filtros XSL / T que transforman el contenido XML

Los filtros se implementan en el archivo descriptor de implementación web.xmly luego mapear a nombres de servlet o JSP o patrones de URL en el descriptor de implementación de su aplicación. El archivo descriptor de implementación web.xml se puede encontrar en el directorio <Tomcat-installation-directory> \ conf .

Cuando el contenedor JSP inicia su aplicación web, crea una instancia de cada filtro que haya declarado en el descriptor de implementación. Los filtros se ejecutan en el orden en que se declaran en el descriptor de implementación.

Métodos de filtro de servlet

Un filtro es simplemente una clase Java que implementa la javax.servlet.Filterinterfaz. La interfaz javax.servlet.Filter define tres métodos:

S.No. Método y descripción
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

El contenedor llama a este método cada vez que se pasa un par de solicitud / respuesta a través de la cadena debido a una solicitud del cliente de un recurso al final de la cadena.

2

public void init(FilterConfig filterConfig)

El contenedor web llama a este método para indicar a un filtro que se está poniendo en servicio.

3

public void destroy()

El contenedor web llama a este método para indicar a un filtro que está fuera de servicio.

Ejemplo de filtro JSP

El siguiente ejemplo muestra cómo imprimir la dirección IP del cliente y la fecha y hora actual, cada vez que accedería a cualquier archivo JSP. Este ejemplo le dará una comprensión básica del filtro JSP, pero puede escribir aplicaciones de filtro más sofisticadas utilizando el mismo concepto:

// 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 de la forma habitual y pon tu LogFilter.class presentar en <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.

Asignación de filtros JSP en Web.xml

Los filtros se definen y luego se asignan a una URL o nombre de archivo JSP, de la misma manera que se define Servlet y luego se asigna a un patrón de URL en web.xmlarchivo. Cree la siguiente entrada para la etiqueta de filtro en el archivo descriptor de implementaciónweb.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>

El filtro anterior se aplicará a todos los servlets y JSP porque especificamos /*en nuestra configuración. Puede especificar un servlet particular o la ruta JSP si desea aplicar un filtro en algunos servlets o solo en JSP.

Ahora intente llamar a cualquier servlet o JSP y verá el registro generado en el registro del servidor web. Puedes usarLog4J logger para registrar el registro anterior en un archivo separado.

Usando múltiples filtros

Su aplicación web puede definir varios filtros diferentes con un propósito específico. Considere, define dos filtros AuthenFilter y LogFilter . El resto del proceso permanecerá como se explicó anteriormente, excepto que necesita crear un mapeo diferente como se menciona a continuación:

<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>

Orden de aplicación de filtros

El orden de los elementos de mapeo de filtros en web.xml determina el orden en el que el contenedor web aplica el filtro al servlet o JSP. Para invertir el orden del filtro, solo necesita invertir los elementos de mapeo de filtro en elweb.xml archivo.

Por ejemplo, el ejemplo anterior aplicará LogFilter primero y luego aplicará AuthenFilter a cualquier servlet o JSP; el siguiente ejemplo invertirá el orden:

<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>