English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Los filtros Servlet pueden interceptar dinámicamente solicitudes y respuestas para transformar o usar la información que contiene en la solicitud o respuesta.
Se puede adjuntar uno o más filtros Servlet a un Servlet o a un grupo de Servlet. Los filtros Servlet también se pueden adjuntar a archivos JavaServer Pages (JSP) y páginas HTML. Se llaman todos los filtros Servlet adjuntos antes de llamar al Servlet.
Los filtros Servlet son clases Java que se pueden usar en la programación Servlet y pueden lograr los siguientes objetivos:
Interceptar estas solicitudes antes de que el cliente acceda a los recursos del backend.
Procesar estas respuestas antes de que se envíen de vuelta al cliente desde el servidor.
Se recomiendan varios tipos de filtros según las regulaciones:
Filtros de Autenticación (Authentication Filters).
Filtros de Compresión de Datos (Data compression Filters).
Filtros de Encriptación (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 contenido XML.
El filtro se declara mediante etiquetas XML en el descriptor de despliegue Web (web.xml) y luego se mapea al nombre de 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.
Un filtro es una clase Java que implementa la interfaz javax.servlet.Filter. La interfaz javax.servlet.Filter define tres métodos:
Número de Orden | Método & Descripción |
---|---|
1 | public void doFilter(ServletRequest, ServletResponse, FilterChain) Este método realiza la operación de filtrado real, cuando el método de solicitud del cliente coincide con la URL configurada por el filtro, el contenedor Servlet llama primero al método doFilter del filtro. El FilterChain permite acceder a los siguientes filtros. |
2 | public void init(FilterConfig filterConfig) Al iniciar la aplicación web, el servidor web crea un ejemplo de objeto Filter y llama a su método init, lee la configuración de web.xml, completa la funcionalidad 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. |
3 | public void destroy() Servlet 容器在销毁过滤器示例前调用该方法,在该方法中释放 Servlet 过滤器占用的资源。 |
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>Base Tutorial Website</param-value> </init-param> </filter>
在 init 方法使用 FilterConfig 对象获取参数:
public void init(FilterConfig config) throws ServletException { // 获取初始化参数 String site = config.getInitParameter("Site"); // 输出初始化参数 System.out.println("网站名称: " ); + site); }
以下是 Servlet 过滤器的示例,将输出网站名称和地址。本示例让您对 Servlet 过滤器有基本的了解,您可以使用相同的概念编写更复杂的过滤器应用程序:
package com.w3codebox.test; //导入必需的 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 Base Tutorial\ 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); } }
Defina el filtro y luego asignelo a una URL o Servlet, lo cual es más o menos igual que definir Servlet y luego asignarlo a un patrón de URL. En el archivo descriptivo de despliegue web.xml Para crear la entrada de etiqueta filter a continuación en
<?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>Base Tutorial Website</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <!-- nombre de la clase --> <servlet-name>DisplayHeader</servlet-name> <!-- 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 web visitado --> <url-pattern>/TomcatTest/DisplayHeader</url-pattern> </servlet-mapping> </web-app>
El filtro anterior se aplica a todos los Servlet porque especificamos en la configuración /* . 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 registros generados en el servidor web. También puede usar Log4El registrador J se utiliza para registrar los logotipos anteriores en un archivo separado.
A continuación, accedemos a esta dirección de ejemplo http://localhost:8080/TomcatTest/DisplayHeader, luego revise el contenido de la salida en la consola, como se muestra a continuación:
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 tratamiento es más o menos igual al 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>
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 de los filtros, simplemente invierta el orden de filter en el archivo web.xml-El elemento mapping es suficiente.
Por ejemplo, en el ejemplo anterior, se 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>
<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 interceptados por un Filter. Un Filter puede interceptar recursos de dos formas: nombre de Servlet y ruta de acceso al recurso
<filter-name>El elemento subyacente se utiliza para configurar 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 la forma 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 establecer varios elementos <dispatcher> para especificar múltiples formas de interceptar recursos por parte del Filter.
Valores que puede establecer el elemento <dispatcher> y su significado
REQUEST: Cuando el usuario accede directamente a la página, el contenedor web llamará al filtro. Si el recurso de destino se accede a través del método include() o forward() de RequestDispatcher, el filtro no se llamará.
INCLUDE: Si el recurso de destino se accede a través del método include() de RequestDispatcher, se llamará a este filtro. De lo contrario, el filtro no se llamará.
FORWARD: Si el recurso de destino se accede a través del método forward() de RequestDispatcher, se llamará a este filtro, de lo contrario, el filtro no se llamará.
ERROR: Si el recurso de destino se llama a través del mecanismo de manejo de excepciones declarativo, se llamará a este filtro. De lo contrario, el filtro no se llamará.