English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Filtros de JSP

Los filtros en JSP y Servlet son clases Java.

Los filtros pueden interceptar dinámicamente solicitudes y respuestas para transformar o usar la información contenida en las solicitudes o respuestas.

Se puede adjuntar un o varios filtros a un Servlet o a un grupo de Servlet. Los filtros también se pueden adjuntar a archivos JavaServer Pages (JSP) y páginas HTML.

Los filtros son clases Java utilizables en la programación de Servlet que pueden lograr los siguientes objetivos:

  • Interceptar estas solicitudes antes de que el cliente acceda a los recursos del backend.

  • Antes de que la respuesta del servidor se envíe al cliente, procesar estas respuestas.

Los tipos de filtros sugeridos por las normas:

  • Filtros de autenticación (Authentication Filters).

  • Filtros de compresión de datos (Data compression Filters).

  • Filtros de cifrado (Encryption Filters).

  • Filtros que desencadenan eventos de acceso a recursos.

  • Filtros de conversión de imágenes (Image Conversion Filters).

  • Filtros de registro y auditoría (Logging and Auditing Filters).

  • MIME-TYPE Filtros de cadena (MIME-TYPE Chain Filters).

  • Filtros de marcado (Tokenizing Filters).

  • XSL/T Filtros (XSL/T Filters), convierte el contenido XML.

El filtro se declara mediante las etiquetas XML en el descriptor de despliegue Web (web.xml) y luego se mapea al nombre del Servlet o al patrón de URL en el descriptor de despliegue de la aplicación.

Cuando el contenedor Web inicia la aplicación Web, crea un ejemplo para cada filtro declarado en el descriptor de despliegue.

El orden de ejecución del Filter coincide con el orden de configuración en el archivo web.xml, generalmente se configura el Filter antes de todos los Servlet.

Métodos del Filtro Servlet

El filtro es una clase Java que ha implementado el interfaz javax.servlet.Filter. El interfaz javax.servlet.Filter define tres métodos:

NúmeroMétodo & Descripción
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
Este método realiza la operación de filtrado real, cuando la solicitud del cliente coincide con la URL configurada por el filtro, el contenedor Servlet llama primero al método doFilter del filtro. FilterChain se utiliza para acceder a los filtros posteriores.
2public void init(FilterConfig filterConfig)
Al inicio de la aplicación web, el servidor web crea un ejemplo del objeto Filter y llama a su método init, lee la configuración de web.xml, completa la función de inicialización del objeto, preparándose para interceptar solicitudes de usuarios posteriores (el objeto Filter solo se crea una vez y el método init solo se ejecuta una vez). Los desarrolladores pueden obtener el objeto FilterConfig que representa la información de configuración actual del filter a través de los parámetros del método init.
3public void destroy()}
Servlet容器在销毁过滤器示例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

FilterConfig 使用

Filter 的 init 方法中提供了一个 FilterConfig 对象。

如 web.xml 文件配置如下:

<filter>
    <filter-name>LogFilter</filter-name>
    <filter-class>com.w3codebox.test.LogFilter</filter-class>
    <init-param>
        <param-name>Site</param-name>
        <param-value>基础教程网</param-value>
    </init-param>
    </filter>

在 init 方法使用 FilterConfig 对象获取参数:

public void init(FilterConfig config) throws ServletException {
    // 获取初始化参数
    String site = config.getInitParameter("Site"); 
    // 输出初始化参数
    System.out.println("网站名称: " + site); 
}

JSP 过滤器示例

以下是 Servlet 过滤器的示例,将输出网站名称和地址。本示例让您对 Servlet 过滤器有基本的了解,您可以使用相同的概念编写更复杂的过滤器应用程序:

//导入必需的 java 库
import javax.servlet.*;
import java.util.*;
//实现 Filter 类
public class LogFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
        // 获取初始化参数
        String site = config.getInitParameter("Site"); 
        // 输出初始化参数
        System.out.println("网站名称: " + site); 
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
        // 输出站点名称
        System.out.println("站点网址:http://es.oldtoolbag.com");
        // 把请求传回过滤链
        chain.doFilter(request,response);
    }
    public void destroy( ){
        /* 在 Filter 示例被 Web 容器从服务移除之前调用 */
    }
}

DisplayHeader.java 文件代码如下:

//导入必需的 java 库
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/DisplayHeader)
//Extender la clase HttpServlet
public class DisplayHeader extends HttpServlet
    // Método para manejar solicitudes de método GET
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // Establecer tipo de contenido de respuesta
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "Ejemplo de solicitud de encabezado HTTP" - Ejemplo de sitio web de tutorial básico";
        String docType =
            "<!DOCTYPE html> \n";
            out.println(docType +
            "<html>\n" +
            "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<table width=\"100%\" border=\"1\" align=\"center\">\n" +
            "<tr bgcolor=\"#949494\">\n" +
            "<th>Nombre de encabezado</th><th>Valor de encabezado</th>\n"+
            "</tr>\n");
        Enumeration headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()) {}}
            String paramName = (String)headerNames.nextElement();
            out.print("<tr><td>" + paramName + "</td>\n");
            String paramValue = request.getHeader(paramName);
            out.println("<td> " + paramValue + "</td></tr>\n");
        }
        out.println("</table>\n</body></html>");
    }
    // Método para manejar solicitudes de método POST
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Mapeo del filtro Servlet en Web.xml

Defina el filtro y luego mapearlo a una URL o Servlet, que es más o menos lo mismo que definir un Servlet y luego mapearlo a un patrón de URL. En el archivo de descriptor de despliegue web.xml en la que se crea la entrada para la etiqueta filter

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
<filter>
  <filter-name>LogFilter</filter-name>
  <filter-class>com.w3codebox.test.LogFilter</filter-class>
  <init-param>
    <param-name>Site</param-name>
    <param-value>基础教程网</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>LogFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>  
  <!-- el nombre de la clase -->  
  <servlet-name>DisplayHeader</servlet-name>  
  <!-- el paquete en el que se encuentra -->  
  <servlet-class>com.w3codebox.test.DisplayHeader</servlet-class>  
</servlet>  
<servlet-mapping>  
  <servlet-name>DisplayHeader</servlet-name>  
  <!-- la dirección del sitio visitado -->  
  <url-pattern>/TomcatTest/DisplayHeader</url-pattern>  
</servlet-mapping>  
</web-app>

El filtro anterior se aplica a todos los Servlet porque especificamos /* . Si solo desea aplicar el filtro a un número reducido de Servlet, puede especificar una ruta de Servlet específica.

Ahora intente llamar a cualquier Servlet de manera común, verá los logs generados en el servidor web. También puede usar Log4El registrador J se utiliza para registrar los logs anteriores en un archivo separado.

A continuación, visitamos esta dirección de ejemplo http://localhost:8080/TomcatTest/DisplayHeader, luego verifique el contenido de la salida en la consola

Uso de varios filtros

La aplicación web puede definir varios filtros diferentes para propósitos específicos. Supongamos que ha definido dos filtros AuthenFilter y LogFilter。Necesita crear un mapeo diferente como se describe a continuación, el resto del proceso es más o menos igual a lo explicado anteriormente:

<filter>
   <filter-name>LogFilter</filter-name>
   <filter-class>com.w3codebox.test.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>com.w3codebox.test.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 del filtro

filter en web.xml-El orden del elemento mapping determina el orden en que el contenedor web aplica el filtro al Servlet. Si desea invertir el orden del filtro, simplemente invierta el orden de filter en el archivo web.xml-mapping>El elemento es suficiente.

Por ejemplo, el ejemplo anterior aplicará primero LogFilter y luego AuthenFilter, pero en el siguiente ejemplo se inviertirá este 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>

Descripción de los nodos de configuración de web.xml

  • <filter>Se especifica un filtro.

    • <filter-name>Se utiliza para especificar un nombre para el filtro, el contenido de este elemento no puede estar vacío.

    • <filter-class>El elemento se utiliza para especificar el nombre completo de la clase del filtro.

    • <init-param>El elemento se utiliza para especificar parámetros de inicialización para el filtro, sus elementos hijos <param-name>Se especifica el nombre del parámetro, <param-value>Se especifica el valor del parámetro.

    • En el filtro, se puede usar el objeto de interfaz FilterConfig para acceder a los parámetros de inicialización.

  • <filter-mapping>El elemento se utiliza para configurar los recursos que intercepta un Filter. Un recurso interceptado por un Filter se puede especificar de dos formas: nombre de Servlet y ruta de acceso al recurso

    • <filter-name>El elemento de hijo se utiliza para establecer el nombre de registro de filter. Este valor debe ser el nombre del filtro declarado en el elemento <filter>.

    • <url-pattern> configura la ruta de solicitud interceptada por el filtro (estilo de URL asociado al filtro)

  • <servlet-name> especifica el nombre del servlet interceptado por el filtro.

  • <dispatcher> especifica el modo en que el contenedor de servlet llama a los recursos interceptados por el filtro, que puede ser REQUEST, INCLUDE, FORWARD o ERROR, por defecto REQUEST. El usuario puede configurar varios elementos <dispatcher> para especificar múltiples formas de interceptar el filtro para diferentes tipos de llamadas de recursos.

  • Los valores que se pueden configurar para el elemento <dispatcher> y su significado

    • REQUEST: Cuando el usuario accede directamente a la página, el contenedor web llama al filtro. Si el recurso de destino se accede a través del método include() o forward() de RequestDispatcher, el filtro no se llama.

    • INCLUDE: Si el recurso de destino se accede a través del método include() de RequestDispatcher, se llama a este filtro. De lo contrario, el filtro no se llama.

    • FORWARD: Si el recurso de destino se accede a través del método forward() de RequestDispatcher, se llama a este filtro, de lo contrario, el filtro no se llama.

    • ERROR: Si el recurso de destino se llama a través del mecanismo de manejo de excepciones declarativas, se llama a este filtro. De lo contrario, el filtro no se llama.