English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Introducción a Filter
Filter también se llama filtro, es una de las tecnologías más útiles en la tecnología Servlet, los desarrolladores web utilizan la tecnología Filter para interceptar todos los recursos web administrados por el servidor web: por ejemplo, Jsp, Servlet, archivos de imágenes estáticos o archivos html estáticos, etc., para implementar algunas funciones especiales. Por ejemplo, implementar el control de acceso de nivel de URL, filtrar palabras sensibles, comprimir la información de respuesta, etc., algunas funciones avanzadas.
Se utiliza principalmente para la preprocesamiento de solicitudes de usuarios, también puede realizar el procesamiento posterior de HttpServletResponse. Flujo completo del uso de Filter: el Filter realiza el preprocesamiento de la solicitud del usuario, luego transfiere la solicitud al Servlet para el procesamiento y la generación de la respuesta, y finalmente el Filter realiza el procesamiento posterior de la respuesta del servidor.
Función de Filter
Interceptar HttpServletRequest antes de que llegue a Servlet. Según sea necesario, verificar HttpServletRequest, también puede modificar la cabecera y los datos de HttpServletRequest.
Interceptar HttpServletResponse antes de que llegue a la cliente. Según sea necesario, verificar HttpServletResponse, también puede modificar la cabecera y los datos de HttpServletResponse.
Cómo implementar la función de interceptación utilizando Filter
En la interfaz Filter hay un método doFilter, cuando los desarrolladores han escrito el Filter y configurado qué recurso web interceptar, el servidor web llama al método doFilter del filter antes de llamar al método service del recurso web cada vez, por lo tanto, escribir código en este método puede lograr los siguientes objetivos:
Ejecutar un fragmento de código antes de llamar al recurso objetivo.
Llamar al recurso objetivo (es decir, permitir que el usuario acceda al recurso web).
El servidor web transmite un objeto filterChain al llamar al método doFilter, el objeto filterChain es uno de los más importantes en la interfaz filter, también proporciona un método doFilter, los desarrolladores pueden decidir según las necesidades si llamar a este método, llamar a este método, el servidor web llamará al método service del recurso web, es decir, el recurso web será accedido, de lo contrario, el recurso web no será accedido.
Dos pasos para el desarrollo de Filter
Escribir una clase java que implemente la interfaz Filter e implemente su método doFilter.
En el archivo web.xml, se registra la clase de filtro escrita y se configura el recurso que puede interceptar.
Introducción a los nodos de configuración de web.xml:
Cadena de Filter
En una aplicación web, se pueden desarrollar varios Filter, que se combinan en una cadena de Filter.
El servidor web decide qué Filter llamar primero según el orden de registro del Filter en el archivo web.xml. Cuando se llama al método doFilter del primer Filter, el servidor web crea un objeto FilterChain que representa la cadena de filtros y se lo pasa al método. En el método doFilter, si el desarrollador llama al método doFilter del objeto FilterChain, el servidor web verificará si hay más filtros en el objeto FilterChain. Si hay, llamará al siguiente.2Un filtro, si no hay, llama al recurso objetivo.
El ciclo de vida del Filter
public void init(FilterConfig filterConfig) throws ServletException;//Inicialización
Al igual que el programa Servlet que escribimos, la creación y destrucción del Filter son responsabilidad del servidor web. Al inicio de la aplicación web, el servidor web crea una instancia del objeto Filter y llama a su método init, lee la configuración web.xml, completa la función de inicialización del objeto, y se prepara 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 del filtro actual a través de los parámetros del método init.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//Interceptar la solicitud
Este método realiza la operación de filtrado real. Cuando el cliente solicita acceder 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 los filtros posteriores.
public void destroy();//Destrucción
Después de que se cree el objeto Filter, se quedará en la memoria, se destruirá cuando la aplicación web se elimine o el servidor se detenga. Se llama antes de que el contenedor web desmonte el objeto Filter. Este método se ejecuta solo una vez en el ciclo de vida del Filter. En este método, se pueden liberar los recursos utilizados por el filtro.
Interfaz FilterConfig
Cuando el usuario configura el filtro, puede configurar algunos parámetros de inicialización para el filtro. Cuando el contenedor web instancie el objeto Filter, llamará al método init y pasará el objeto filterConfig encapsulado con los parámetros de inicialización del filtro. Por lo tanto, los desarrolladores pueden obtener lo siguiente a través de los métodos del objeto filterConfig al escribir el filtro:
String getFilterName();//Obtener el nombre del filtro. String getInitParameter(String name);//Devuelve el valor del parámetro de inicialización especificado en la descripción de despliegue. Si no existe, devuelve null. Enumeration getInitParameterNames();//Devuelve la colección de nombres de parámetros de inicialización de todos los filtros. public ServletContext getServletContext();//Devuelve la referencia al objeto ServletContext.
Ejemplo de uso de Filter
Uso de Filter para verificar la seguridad del inicio de sesión del usuario
Recientemente participé en la mantenimiento de un proyecto, después de que el usuario saliera del sistema y visitara la historia en la barra de direcciones, según la url, aún podía ingresar a la página de respuesta del sistema. Vamos a revisar y descubrimos que no se realizó la verificación de filtrado de solicitud para verificar el inicio de sesión del usuario. ¡Añadir un filtro para resolver el problema!
Primero configure en web.xml
<filtro <filtro-name>SessionFilter</filtrar-nombre> <filtro-class>com.action.login.SessionFilter</filtrar-clase> <inicial-parámetro> <parámetro-name>logonStrings</parámetro-nombre><!-- No se realiza el filtrado para la página de inicio de sesión --> <parámetro-valor>/proyecto/index.jsp;login.do</parámetro-valor> </inicial-parámetro> <inicial-parámetro> <parámetro-name>includeStrings</parámetro-nombre><!-- Se realiza el filtrado solo para los sufijos de parámetros de filtrado especificados --> <parámetro-value>.do;.jsp</parámetro-valor> </inicial-parámetro> <inicial-parámetro> <parámetro-name>redirectPath</parámetro-nombre><!-- No se pasó a la interfaz de inicio de sesión --> <parámetro-valor>/index.jsp</parámetro-valor> </inicial-parámetro> <inicial-parámetro> <parámetro-name>disabletestfilter</parámetro-nombre><!-- Y: Filtrado inválido --> <parámetro-value>N</parámetro-valor> </inicial-parámetro> </filtro> <filtro-mapeo> <filtro-name>SessionFilter</filtrar-nombre> <url-patrón>/*</url-patrón> </filtrar-mapeo>
a continuación, escriba FilterServlet
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.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; /** * Determinar si el usuario ha iniciado sesión, si no ha iniciado sesión, salir del sistema */ public class SessionFilter implements Filter { public FilterConfig config; public void destroy() { this.config = null; } public static boolean isContains(String container, String[] regx) { boolean result = false; for (int i = 0; i < regx.length; i++) { if (container.indexOf(regx[i]) != -1) { return true; } } return result; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest hrequest = (HttpServletRequest)request; HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response); String logonStrings = config.getInitParameter("logonStrings"); // Página de inicio de sesión de inicio de sesión String includeStrings = config.getInitParameter("includeStrings"); // Parámetros de sufijo de recursos de filtrado String redirectPath = hrequest.getContextPath() + config.getInitParameter("redirectPath");// Página de redirección sin inicio de sesión String disabletestfilter = config.getInitParameter("disabletestfilter");// ¿Es válido el filtro? if (disabletestfilter.toUpperCase().equals("Y")) { // Filtrado inválido chain.doFilter(request, response); return; } String[] logonList = logonStrings.split(";"); String[] includeList = includeStrings.split(";"); if (!this.isContains(hrequest.getRequestURI(), includeList)) {// Se realiza el filtrado solo para los sufijos de parámetros de filtrado especificados chain.doFilter(request, response); return; } if (this.isContains(hrequest.getRequestURI(), logonList)) {// No se realiza el filtrado para la página de inicio de sesión chain.doFilter(request, response); return; } String user = (String) hrequest.getSession().getAttribute("useronly");//Determinar si el usuario ha iniciado sesión if (user == null) { wrapper.sendRedirect(redirectPath); return; } else { chain.doFilter(request, response); return; } } public void init(FilterConfig filterConfig) throws ServletException { config = filterConfig; } }
De esta manera, se puede completar la validación de inicio de sesión del usuario para todas las solicitudes, que deben pasar por este Filter.
Filtro de prevención de malcódigo de chino
Cuando el proyecto utiliza el framework spring. Cuando la página JSP frontal y el código Java utilizan diferentes conjuntos de caracteres para la codificación, se producirán datos de envío de formulario o subida/Si se produce un problema de malcódigo al descargar archivos con nombres en chino, se puede usar este filtro.
<filtro <filtro-nombre>codificación</filtrar-nombre> <filtro-clase>org.springframework.web.filter.CharacterEncodingFilter</filtrar-clase> <inicial-parámetro> <parámetro-nombre>codificación</parámetro-nombre><!--Se utiliza para especificar un conjunto de caracteres específico--> <parámetro-valor>UTF-8</parámetro-valor> </inicial-parámetro> <inicial-parámetro> <parámetro-nombre>forceEncoding</parámetro-nombre><!--true: independientemente de si el request especificó el conjunto de caracteres, se utiliza codificación; false: si el request ya especificó un conjunto de caracteres, no se utiliza codificación--> <parámetro-valor>false</parámetro-valor> </inicial-parámetro> </filtro> <filtro-mapeo> <filtro-nombre>codificación</filtrar-nombre> <url-patrón>/*</url-patrón> </filtrar-mapeo>
Esto es todo el contenido de este artículo, espero que haya sido útil para su aprendizaje y que todos apoyen a la tutorial de alarido.
Declaración: el contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet por su propia iniciativa. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume responsabilidad alguna por la responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar, y proporcione evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.