1. Introducción al filtro
El filtro también se llama filtro. Es la tecnología más emocionante en tecnología de servlet. A través de la tecnología de filtro, los desarrolladores web interceptan todos los recursos web administrados por los servidores web: como JSP, Servlet, archivos de imagen estáticos o archivos HTML estáticos, lo que logró algunas funciones especiales. Por ejemplo, implementa algunas funciones avanzadas, como el control de acceso a permiso a nivel de URL, filtrando vocabulario confidencial e información de respuesta de comprimir.
La API Servlet proporciona una interfaz de filtro. Al desarrollar aplicaciones web, si la clase Java escrita implementa esta interfaz, la clase Java se llama filtro de filtro. A través de la tecnología de filtro, los desarrolladores pueden implementar las solicitudes y respuestas de acceso de los usuarios antes de acceder a un recurso de destino, como se muestra a continuación:
2. ¿Cómo se intercepta el filtro?
Hay un método Dofilter en la interfaz de filtro. Cuando escribimos filtrar y configurar qué recurso web interceptará, el servidor web llamará al método de filtro Dofilter cada vez antes de llamar al método de servicio del recurso web. Por lo tanto, escribir código en este método puede lograr el siguiente propósito:
1. Deje que se ejecute una pieza de código antes de llamar al recurso de destino.
2. Si debe llamar al recurso objetivo (es decir, si permitir a los usuarios acceder al recurso web).
3. Después de llamar al recurso objetivo, deje que se ejecute un pedazo de código.
Cuando el servidor web llama al método Dofilter, pasará un objeto FilterChain. El objeto FilterChain es el objeto más importante en la interfaz de filtro. También proporciona un método Dofilter. Los desarrolladores pueden decidir si llamar a este método de acuerdo con sus necesidades. Si se llama a este método, el servidor web llamará al método de servicio del recurso web, es decir, se accederá al recurso web, de lo contrario, no se accederá al recurso web.
3. Comenzando con el desarrollo de filtros
3.1. Pasos de desarrollo de filtros
El desarrollo del filtro se divide en dos pasos:
1. Escriba una clase Java para implementar la interfaz de filtro e implementar su método Dofilter.
2. Use los elementos <filter> y <filter-mapping> en el archivo web.xml para registrar la clase de filtro escrita y establecer los recursos que puede interceptar.
Ejemplo del filtro:
paquete me.gacl.web.filter; import java.io.ioException; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterConfig; import javax.servlet.servletException; import javax.servlet.servletrequest; import javax.servlet.servletResponse;/*** @classname: filterDemo*@Description: tres aplicaciones típicas de filtro:*, puede decidir si la cadena de llamadas. Se ejecuta el recurso, se puede capturar el resultado de ejecución del recurso objetivo, dando cuenta de algunas funciones especiales* @author: 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小 小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小 � filterchain cadra) lanza ioexception, servletException {// Por favor, algunos preprocesamiento a solicitud y respuesta request.setcharacterEncoding ("utf-"); respuesta.setcharacterEncoding ("utf-"); respuesta.setContentType ("text/html; charset = utf-"); system.out.println ("FilterDemo antes de ejecutivo !!!"); cadena.dofilter (solicitud, respuesta); // deje que el recurso de destino ejecute y libere system.out.println ("FilterDemo después de la ejecución!!");}@OverridePublic void destruye () {System.out.println ("---- Destrucción de filtro ----");}} Configurar filtros en web.xml:
<? xml versión = "." encoding = "utf-"?> <web-app versión = "." xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w.org//xmlschema-instance http://java.sun.com/xml/ns/javaee/web-app__.xsd "> <pantsip-name> </sipplay-name> <welcome-file-list> <levle-file> index.jsp </le welcome-file> </welcome-file-list> <!-Configuration Filtro-> <filter> <filter-name> filterDemo </filter-name> <filter-class> me.gacl.web.filter.filterdemo </filter-class> </filtre> <!-mapeo de filtro-> <filter-mapping> <filter-name> filtreDemo </filter-name> <!-"/*" significa intereptación de todo Solicitudes-> <url-pattern>/*</sl-Pattern> </filter-mapping> </web-app>
3.2. Cadena de filtro
En una aplicación web, se pueden desarrollar y escribir múltiples filtros, que se combinan en una cadena de filtro.
El servidor web decide qué filtro llamar primero de acuerdo con el orden en que el filtro está registrado en el archivo web.xml. Cuando se llama el método Dofilter del primer filtro, el servidor web creará un objeto FilterChain que representa la cadena de filtro y lo pasará al método. En el método Dofilter, si el desarrollador llama al método Dofilter del objeto FilterChain, el servidor web verificará si todavía hay un filtro en el objeto FilterChain. Si lo hay, se llama al segundo filtro, y si no hay, se llama al recurso objetivo.
4. El ciclo de vida del filtro
4.1. Creación de filtro
La creación y destrucción del filtro es responsabilidad del servidor web. Cuando se inicia la aplicación web, el servidor web creará un objeto de instancia de filtro y llamará a su método Init para completar la función de inicialización del objeto, preparándose así para la intercepción para las solicitudes de los usuarios posteriores. El objeto de filtro solo se creará una vez, y el método init solo se ejecutará una vez. A través de los parámetros del método init, se puede obtener un objeto FilterConfig que representa la información de configuración del filtro actual.
4.2. Destrucción del filtro
El contenedor web llama al método Destroy para destruir el filtro. El método Destroy se ejecuta solo una vez durante el ciclo de vida del filtro. En el método Destroy, los recursos utilizados por el filtro pueden liberarse.
4.3. Interfaz FilterConfig
Al configurar filtros, los usuarios pueden usar <Init-Param> para configurar algunos parámetros de inicialización para filtros. Cuando el contenedor web instancia el objeto Filter y llama a su método init, el objeto FilterConfig que encapsula los parámetros de inicialización del filtro se pasará. Por lo tanto, cuando los desarrolladores escriban filtros, pueden obtener:
String getFiltername (): obtenga el nombre del filtro.
String getInitParameter (nombre de cadena): Devuelve el valor del parámetro de inicialización con el nombre especificado en la descripción de implementación. Devuelve nulo si no existe.
Enumeración getInitParamTernames (): Devuelve un conjunto de enumeración de nombres de todos los parámetros de inicialización del filtro.
Public ServletContext getServletContext (): Devuelve una referencia al objeto de contexto Servlet.
Ejemplo: use FilterConfig para obtener información de configuración de filtro
paquete me.gacl.web.filter; import java.io.ioexception; import java.util.enumeration; import javax.servlet.filter; import javax.servlet.filterchain; import javax.servlet.filterConfig; import javax.servlet.servletexception; import javax.servlet.servlet; javax.servlet.servletResponse; public class FilterDemo implementa el filtro {/*Filter Initialization*@see javax.servlet.filter#init (javax.servlet.filterconfig)*/ @overridePublic void init (filtroconfig FilterConfig) ServletException {System.out.Println ("----------"); <filter> <filter-name> FilterDemo </filter-name> <filter-class> me.gacl.web.filter.filterdemo </filter-class> <!-Configure los parámetros de inicialización del filtro FilterDemo-> <it-param> <Scuidion> Configure los parámetros de inicialización de FilterDemo Filtro </cription> <amamname> nombre </param-name> <amam-value> gacl </marr-value> </it-param> <init-p aram> <cription> Configure los parámetros de inicialización de FilterDemo Filtro </cription> <amamname> como </param-name> <amam-value> java </am-value> </ init-param> </filtro> <filter-mapping> <filter-name> filterDemo </filter-name> <!-"/*" significa interceptar todas las solicitudes-> <url-pattern>/*</url-pattern> </filtre-mapping-mapping-**////////////////////////////////name filtre's name el nombre de filtro = FilterConfig.getFiltername (); // Obtenga el parámetro de inicialización configurado en el archivo web.xml String initParam = filterconfig.getInitParameter ("nombre"); String InitParam = FilterConfig.getInitParameter ("me gusta"); // Devuelve un conjunto de enumeración de nombres de todos los parámetros de inicialización del filtro. Enumeration <String> InitParamTernames = FilterConfig.getInitParamTernames (); System.out.println (Filtername); System.out.println (initParam); System.out.println (initParam); System.out.println (InitParam); while (initParameternames.hasmoreElements ()) {String paramName = (string) initParameternames.nextelement (); system.out.println (paramName);}}@overridePublic void doFilter (ServletRequest Solicitud, Respuesta de ServletResponse, FilterChain Chain) lanza IoException, ServletException {System.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out.out. ¡¡¡ejecución!!!"); Chain.dofilter (solicitud, respuesta); // deja que se ejecute el recurso de destino y System.out.println ("FilterDemo después de la ejecución !!!");}@overridePublic void destruir () {system.out.println ("--- destrucción de filtro ----");}} 5. Implementación del filtro
La implementación del filtro se divide en dos pasos:
1. Registro de filtro
2. Filtro de mapeo
5.1. Filtro de registro
Después de desarrollar Filter, debe registrarse en el archivo web.xml para que el servidor web pueda llamarlo.
Registre el ejemplo del filtro en el archivo web.xml:
<Trime> <Scuidtion> FilterDemo Filter </cription> <filter-name> FilterDemo </filter-name> <filter-class> me.gacl.web.filter.filterdemo </filter-class> <!-Configure los parámetros de inicialización del filtro FilterDemo-> <In init-param> <Scuion> Configurar parámetros de inicialización de FilterDemo </ésSeC FILTRO ript> <amamname> name </param-name> <amam-value> gacl </marr-value> </it-param> <init-param> <Scuidtion> Configure los parámetros de inicialización del filtro de filtro </description> <amamname> me gusta </param-name> <amarr-value> java </marr-value> </inithin-param> </filtro> </filtro>
<Scuion> se utiliza para agregar información de descripción. El contenido de este elemento puede estar vacío y <Scuion> no se puede configurar.
<filter-name> se usa para especificar un nombre para el filtro, y el contenido del elemento no puede estar vacío.
El elemento <Trime-Class> se usa para especificar el nombre de clase calificado completo del filtro.
El elemento <Init-Param> se usa para especificar los parámetros de inicialización para el filtro, y su elemento infantil <amamname> especifica el nombre del parámetro y <amam-value> Especifica el valor del parámetro. En el filtro, el objeto de la interfaz FilterConfig se puede usar para acceder a los parámetros de inicialización. Si el filtro no necesita especificar los parámetros de inicialización, el elemento <Init-Param> puede no estar configurado.
5.2. Filtro de mapeo
Después de registrar el filtro en el archivo web.xml, también debe mapear filtrar en el archivo web.xml
<
El elemento <filter-mapping> se usa para establecer el recurso de que un filtro es responsable de interceptar. Un filtro intercepta un recurso se puede especificar de dos maneras: el nombre del servlet y la ruta de solicitud de acceso a recursos.
El elemento infantil <filter-name> se usa para establecer el nombre de registro del filtro. Este valor debe ser el nombre del filtro declarado en el elemento <url-pattern>. Establezca la ruta de solicitud interceptada por filtro (el estilo URL asociado con el filtro)
<Servlet-name> Especifica el nombre del servlet interceptado por el filtro.
<Stapating> Especifica la forma en que el contenedor Servlet llama el recurso interceptado por el filtro. Puede ser uno de solicitud, incluir, reenviar y error, y la solicitud predeterminada. Los usuarios pueden establecer múltiples subelementos <Sapante> para especificar
El filtro intercepta varias formas de llamar recursos. como sigue:
<Trime-mapping> <filter-name> testFilter </filtre-name> <url-pattern> /index.jsp </sl-pattern> <patador> solicitud </spatcher> <satcher> delantero </spatter> </filter-mapping>
Los valores que puede establecer el elemento infantil y sus significados:
1. Requestador: cuando el usuario accede directamente a la página, el contenedor web llamará al filtro. Si se accede al recurso de destino a través del método incluir () o avance () del requestdisPatcher, no se llamará al filtro.
2. Incruse: si se accede al recurso de destino a través del método incluir () de requestdispatcher, se llamará al filtro. Aparte de eso, no se llamará al filtro.
3.Forward: si se accede al recurso de destino a través del método Forward () de requestDisPatcher, se llamará al filtro y no se llamará al filtro además.
4.Error: si el recurso objetivo se llama a través del mecanismo de manejo de excepciones declarativas, se llamará al filtro. Aparte de eso, no se llamará al filtro.