Introducción al filtro
El filtro también se llama filtro. Es la tecnología más práctica en la 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.
Se usa principalmente para preprocesar las solicitudes de los usuarios, y también puede procesar httpservletResponse. El proceso completo de usar el filtro: el filtro preprocesas las solicitudes de los usuarios, luego entregue la solicitud al servlet para procesar y genera una respuesta, y finalmente filtra procesas posteriores a la respuesta del servidor.
Función de filtro
1. Intercepe la HttpServletRequest del cliente antes de que llegue el httpservletRequest llega al servlet. Verifique el httpservletRequest según sea necesario, y también puede modificar el encabezado y los datos httpservletrequest.
2. Interceptar httpservletResponse antes de que llegue al cliente. Verifique httpservletResponse según sea necesario, y también puede modificar el encabezado y los datos httpservletResponse.
Cómo usar el filtro para implementar la función de intercepción
Hay un método Dofilter en la interfaz de filtro. Cuando el desarrollador escribe el filtro y configura qué recurso web interceptará, el servidor web llamará al método Dofilter del filtro 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).
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.
Desarrollo del filtro Dos pasos
Escriba una clase Java para implementar la interfaz de filtro e implementar su método Dofilter.
Use y elementos en el archivo web.xml para registrar la clase de filtro escrita y establecer los recursos que puede interceptar.
Introducción a los nodos de configuración web.xml:
El elemento <filter-mapping> se usa para establecer el recurso que el filtro es responsable de la interceptación. Un filtro intercepta un recurso se puede especificar de dos maneras: el nombre del servlet y la ruta de solicitud de acceso a recursos.
<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 para interceptar varias formas de llamar a los recursos.
El valor y su significado que el elemento infantil puede establecer es el siguiente
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.
Ciclo de vida del filtro
public void init (filterconfig filtreConfig) lanza ServletException; // Inicialización
Al igual que el programa Servlet que escribimos, 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 leer la configuración web.xml para completar la función de inicialización del objeto, preparándose así para la intercepción para las solicitudes de usuarios posteriores (el objeto de filtro solo se creará una vez, y el método Init solo se ejecutará una vez). Los desarrolladores pueden obtener el objeto FilterConfig que representa la información de configuración del filtro actual a través de los parámetros del método init.
Public void dofilter (solicitud de servletRequest, respuesta de servicio de servicio, cadena de cadena de filtro) lanza ioexception, servletException; // solicitud de interceptación
Este método completa la operación de filtrado real. Cuando el cliente solicita acceso a la URL asociada con el filtro, el filtro Servlet ejecutará primero el método Dofilter. El parámetro FilterChain se utiliza para acceder a filtros posteriores.
Public void destruir (); // destruir
El objeto de filtro residirá en la memoria después de la creación y se destruirá cuando se elimine la aplicación web o se detenga el servidor. Llamado antes del contenedor web desinstale el objeto de filtro. Este método se ejecuta solo una vez durante el ciclo de vida del filtro. En este método, se pueden liberar los recursos utilizados por el filtro.
Interfaz FilterConfig
Al configurar filtros, los usuarios pueden configurar algunos parámetros de inicialización para los filtros. Cuando el contenedor web instancia el objeto Filter y llama a su método Init, pasará en el objeto FilterConfig que encapsula los parámetros de inicialización del filtro. Por lo tanto, cuando los desarrolladores escriben filtros, pueden obtener el siguiente contenido a través del método del objeto FilterConfig:
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. Si no hay existencia, regrese nulo. Enumeration 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.
Casos de uso de filtros
Use el filtro para verificar el control de seguridad de inicio de sesión del usuario
Participé en el mantenimiento de un proyecto hace algún tiempo. Después de que el usuario salió del sistema, fue a la barra de direcciones para acceder al historial. Según la URL, aún podría ingresar a la página de respuesta del sistema. Revisé y descubrí que la solicitud no se filtró y verificó que el inicio de sesión del usuario se inició sesión. ¡Agregue un filtro para resolver el problema!
Primero configelo en Web.xml
<filter> <filter-name>SessionFilter</filter-name> <filter-class>com.action.login.SessionFilter</filter-class> <init-param> <param-name>logonStrings</param-name><!-- Don't filter the login page --> <param-value>/project/index.jsp;login.do</param-value> </init-param> <init-param> <Amam-name> includeStings </param-name> <!-Filtro solo el sufijo del parámetro de filtro especificado-> <amam-value> .do; .jsp </amam-value> </it-param> <itiDparam> <amamname> redirectpath </param-name-name> <!-no a través de saltar a la interfaz de inicio de sesión-> <amam-value> </init-param> <Initparam> <Amam-name> DisableTestFilter </param-name> <!-y: filtro inválido-> <amam-value> n </param-value> <!-http://wwww.manongjc.com/article/1613.html-> </initparam> </filtro> <filter> <filter-name> sessionFilter </filter-name> <url-pattern>/*</sl-Pattern> </filter-mapping>
Luego escriba FilTRESERVLET.JAVA:
paquete com.action.login; 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.servlet; importar; import javax.servlet.servletRequest; import javax.servlet.servlet; importar; import javax.servlet.servletRequest; import javax.servlet.servlet; importar; import javax.servlet.servletRequest; import javax.servlet.servlet; import; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import javax.servlet.http.httpservletResponsewrappers;/*** Determine si el usuario está iniciado y si no está registrado, exit el sistema* http://www.manongjc.com/article/1613.html */public class SessionFilter Implements Filter {public FilterConfig config; public void destruye () {this.config = null; } public static static boolean isContains (String Container, String [] Regx) {boolean result = false; for (int i = 0; i <regx.length; i ++) {if (contenedor.indexof (regx [i])! = -1) {return true; }} Resultado de retorno; } public void dofilter (ServletRequest Solicitud, Respuesta ServletResponse, FilterChain Chain) lanza IOException, ServletException {httpservletRequest hrequest = (httpservletRequest) solicitud; HttpservletResponseWrapper wrapper = new httpservletResponseWrapper ((httpservletResponse) respuesta); String logonstrings = config.getInitParameter ("logonstrings"); // Iniciar sesión para inicio de sesión en la página de la página includestrings = config.getInitParameter ("includestrings"); // Filtro de parámetros de sufijo de recursos Cadena redirectPath = hrequest.getContextPath () + config.getInitParameter ("redirectPath"); // No hay inicio de sesión en la cadena de la página Turn DisableTestFilter = config.getInitParameter ("DisableTestFilter"); // es el filtro Valid if (DisableTestFilter.ToUpperperCase (). Equals ("y")) {// Cadena Inválido.dofilter (solicitud, respuesta); devolver; } String [] LogonList = logonstrings.split (";"); String [] includeList = includestrings.split (";"); if (! this.Iscontains (hrequest.getRequesturi (), includeNist)) {// Solo filtra el parámetro de filtro especificado Chain.dofilter (solicitud, respuesta); devolver; } if (this.isContains (hrequest.getRequesturi (), logonList)) {// no filtre la página de inicio de sesión. devolver; } String user = (string) hrequest.getSession (). GetAttribute ("useronly"); // juzga si el usuario está conectado si (user == null) {wrapper.sendedirect (redirectPath); devolver; } else {chain.dofilter (solicitud, respuesta); devolver; }} public void init (filterconfig filtreConfig) lanza ServletException {config = filtreConfig; }}De esta manera, se pueden completar todas las solicitudes al usuario, y el inicio de sesión del usuario debe verificarse a través de este filtro.
Evitar filtros chinos confusos
Cuando el proyecto usa el marco de primavera. Cuando se utilizan diferentes conjuntos de caracteres en la página JSP actual y el código Java para la codificación, habrá problemas confusos con los datos enviados por el formulario o la carga/descarga de archivos de nombre chino. Entonces puedes usar este filtro.
<filter> <filter-name> codificación </filtro-name> <filter-class> org.springframework.web.filter.characteriCodingFilter </filter-class> <Init-param> <amamname> codificación </param-name> <! --- Se utiliza para especificar un conjunto de caracteres específico-> <amam-value> Utf-8 </param-value> </value> <////initil <Init-Param> <Amam-name> ForceEncoding </param-name> <!-Verdadero: independientemente de si la solicitud ha especificado un conjunto de caracteres, se utiliza la codificación; Falso: si la solicitud ha especificado un conjunto de caracteres, la codificación no se usa-> <amam-value> false </am-value> </it-param> </sille> <filter-mapping> <filter-name> codificación </filter-name> <url-pattern>/*</url-Pattern> </filter-mapping>
Spring+Hibernate OpenSessionInviewFilter controla el interruptor de la sesión
Cuando Hibernate+Spring se usa junto con él, si lazy = True se establece (carga retrasada), luego, cuando lea los datos, Hibernate cerrará automáticamente la sesión después de leer los datos principales. De esta manera, cuando desee usar los datos asociados y los datos infantiles, el sistema arrojará un error de HowerInit. En este momento, debe usar el filtro OpenSessionInviewFilter proporcionado por Spring.
OpenSessionInviewFilter mantiene principalmente el estado de la sesión hasta que la solicitud envíe todas las páginas al cliente, y no cierre la sesión hasta que se complete la solicitud, para resolver los problemas causados por la carga perezosa.
Nota: La configuración de OpenSessionInviewFilter debe escribirse frente a la configuración de Struts2. Debido a que el contenedor TomCat se carga en secuencia al cargar el filtro, si el archivo de configuración escribe primero la configuración del filtro de Struts2, y luego la configuración del filtro OpenSessionInviewFilter, el orden de carga da como resultado que la sesión no se administre por Spring al obtener datos.
<filter> <!-Carga perezosa habilitada en Spring-> <filter-name> OpenSessionInviewFilter </filter-Name> <Stroy Filter> org.springframework.orm.hibernate3.support.OpensessionInviewFilter </filter-class> <itin-param> <amamname> sessionfactorname </param-name> <!-predeterminado) Por defecto, el Bean con ID como SessionFactory desde el contenedor Spring. Si el ID no es SessionFactory, debe configurarlo de la siguiente manera. Aquí, el SessionFactory es el frijol en el contenedor de primavera. -> <Amam-Value> SessionFactory </param-value> </it-param> <it-param> <amamname> singleSession </param-name> <!-SingleSession Defaults en true, si se establece en falso, es igual a no usar USESISSIONInView-> <Param-Value> True </Param-Value> </init-param> <filter-name> OpenSessionInviewFilter </filter-name> <url-pattern>*. do </url-pattern> </filtre-mapping>
Configuración web.xml de Struts2
Para usar Struts2 en el proyecto, también debe configurar un filtro en Web.xml para interceptar solicitudes y ir a la acción de Struts2 para el procesamiento.
Nota: Si en la versión Struts2 antes de 2.1.3, el filtro usa org.apache.struts2.dispatcher.filterdispatcher. De lo contrario, use org.apache.struts2.dispatcher.ng.filter.strutsprepareanDexCuteFilter. Comenzando con Struts 2.1.3, se abandonará el filtro ActionContextCleanUp, mientras que la funcionalidad correspondiente se incluye en el filtro StrutSPrepareAnDexCuteFilter.
Se configuran tres parámetros de inicialización:
< <Url-Pattern>*. Do </URL-Pattern> </filter-mapping>
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!