Servlets - Filtros de escritura

Los filtros de servlet son clases de Java que se pueden utilizar en la programación de servlet para los siguientes propósitos:

  • Para interceptar solicitudes de un cliente antes de que acceda 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.xml y luego asignarlos a nombres de servlet o patrones de URL en el descriptor de implementación de su aplicación.

Cuando el contenedor web 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 interfaz javax.servlet.Filter. La interfaz javax.servlet.Filter define tres métodos:

No Señor. 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 se está poniendo fuera de servicio.

Filtro de servlet: ejemplo

A continuación se muestra el ejemplo de filtro de servlet que imprimiría la dirección IP del cliente y la fecha y hora actual. Este ejemplo le daría una comprensión básica de Servlet Filter, pero puede escribir aplicaciones de filtro más sofisticadas usando 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 coloque su archivo de clase en <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes

Asignación de filtros de servlet en Web.xml

Los filtros se definen y luego se asignan a una URL o Servlet, de la misma manera que se define Servlet y luego se asigna a un patrón de URL. 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 a todos los servlets porque especificamos /*en nuestra configuración. Puede especificar una ruta de servlet en particular si desea aplicar el filtro solo en algunos servlets.

Ahora intente llamar a cualquier servlet de la forma habitual y verá el registro generado en el registro de su servidor web. Puede usar el registrador Log4J 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ía 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. Para invertir el orden del filtro, solo necesita invertir los elementos de mapeo del filtro en el archivo web.xml.

Por ejemplo, el ejemplo anterior aplicaría LogFilter primero y luego aplicaría AuthenFilter a cualquier servlet, pero el siguiente ejemplo invertiría 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>