Los filtros en Servlets y JSP son clases de Java y su propósito de existencia es el siguiente:
Interceptar al solicitar acceso a un recurso de backend
Administrar las respuestas devueltas desde el servidor al cliente.
A continuación se enumeran varios tipos de filtros comunes:
Filtro de autenticación
Filtro de compresión de datos
filtro de cifrado
Filtros que desencadenan eventos de acceso a recursos
Filtro de conversión de imágenes
Filtros de inicio de sesión y autenticación
Filtro de cadena tipo MIME
Filtro de tokens
Filtros XSL/T para transformar contenido XML
El filtro se insertará en el archivo web.xml y se asignará al nombre del servlet, archivo JSP o patrón de URL. El archivo de descripción de implementación web.xml se puede encontrar en el directorio <directorio-de-instalación-de-Tomcat>conf.
Cuando el contenedor JSP inicia una aplicación web, crea una instancia de cada filtro. Estos filtros deben declararse en el archivo descriptor de implementación web.xml y ejecutarse en el orden en que se declaran.
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 serie | Método y descripción |
|---|---|
| 1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) El contenedor llamará a este método cada vez que una solicitud/respuesta pase a través de la cadena de filtro, porque el cliente solicita recursos al final de la cadena. |
| 2 | public void init (FilterConfig filterConfig) El contenedor llama a este método para indicar que se coloca un filtro en el servicio. |
| 3 | public void destroy() El contenedor llama a este método para indicar que se está eliminando un filtro del servicio. |
Este ejemplo imprimirá la dirección IP y la fecha y hora de cada acceso al archivo JSP. Por supuesto, este es solo un ejemplo simple para darle una idea del uso de filtros simples, pero puede usar estos conceptos para construir programas más complejos por su cuenta.
//Introducir el paquete Java import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.* //Implementar la clase de filtro public class LogFilter implements Filter { public void init( FilterConfig config) throws ServletException{ // Obtener parámetros de inicialización String testParam = config.getInitParameter("test-param"); //Imprimir parámetros de inicialización System.out.println("Test Param: " + testParam); } public void doFilter(Solicitud ServletRequest, respuesta ServletResponse, cadena FilterChain) throws java.io.IOException, ServletException { // Obtener la dirección IP del cliente String ipAddress = request.getRemoteAddr(); // Dirección IP de salida y hora actual System.out.println("IP "+ ipAddress + ", Time " + new Date().toString()); // Pasa la cadena de filtro de solicitud chain.doFilter(request,response } public void destroy(){ /* Después de que se destruye la instancia del filtro en el; servidor Llamado antes de la eliminación. */ }}Compile el archivo LogFilter.java y luego coloque el archivo de clase compilado en el directorio <directorio de instalación de Tomcat>/webapps/ROOT/WEB-INF/classes.
Los filtros se definen y luego se asignan a una URL o un nombre de archivo JSP, de manera muy similar a cómo se definen y asignan los servlets. En el archivo de descripción de implementación web.xml, utilice la etiqueta <filter> para la asignación de filtros:
<filtro> <filtro-nombre>LogFilter</filtro-nombre> <filtro-clase>LogFilter</filtro-clase> <init-param> <param-nombre>test-param</param-nombre> <param-valor >Parámetro de inicialización</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 programas JSP porque especificamos "/*" en la configuración. También puede especificar una ruta de servlet o JSP si solo desea aplicar el filtro a unos pocos servlets o programas JSP.
Ahora, acceda al servlet o página JSP como de costumbre y encontrará un registro de este acceso en el registro del servidor. También puede utilizar el registrador Log4J para iniciar sesión en otros archivos.
Su aplicación web puede definir muchos filtros diferentes. Ahora que tiene dos filtros definidos, AuthenFilter y LogFilter, los demás pasos son los mismos que antes, excepto que crea una asignación diferente, como esta:
<filtro> <filtro-nombre>LogFilter</filtro-nombre> <filtro-clase>LogFilter</filtro-clase> <init-param> <param-nombre>test-param</param-nombre> <param-valor >Parámetro de inicialización</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>Parámetro de inicialización</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>
El orden de mapeo de los elementos <filter> en web.xml determina el orden en el que el contenedor aplica estos filtros. Para invertir el orden de aplicación, simplemente invierta el orden en que se definen los elementos <filter> en web.xml.
Por ejemplo, el ejemplo anterior aplicaría LogFilter primero y luego AuthenFilter, pero el siguiente ejemplo invertiría el orden de aplicación:
<filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>LogFilter</filter -nombre> <url-pattern>/*</url-pattern></filter-mapping>