Me pregunto si hay alguna anotación para una Filter
clase (para aplicaciones web) en Spring Boot. Tal vez @Filter
?
Quiero agregar un filtro personalizado en mi proyecto.
La Guía de referencia de Spring Boot mencionó
FilterRegistrationBean
, pero no estoy seguro de cómo usarla.
java
configuration
spring-boot
servlet-filters
janetsmith
fuente
fuente
Respuestas:
Si desea configurar un filtro de terceros, puede usarlo
FilterRegistrationBean
. Por ejemplo, el equivalente de web.xmlEstos serán los dos frijoles en su
@Configuration
archivoLo anterior se probó con spring-boot 1.2.3
fuente
someFilter()
directamente.Aquí hay un ejemplo de un método para incluir un filtro personalizado en una aplicación Spring Boot MVC. Asegúrese de incluir el paquete en un escaneo de componentes:
fuente
MetricsFilter
, pero este bean será eclipsado por el bean actuador Spring del mismo nombre. Aprendido de la manera difícil ...No hay una anotación especial para denotar un filtro de servlet. Simplemente declaras un
@Bean
tipoFilter
(oFilterRegistrationBean
). Un ejemplo (agregar un encabezado personalizado a todas las respuestas) está en el propio EndpointWebMvcAutoConfiguration de Boot ;Si solo declara un
Filter
, se aplicará a todas las solicitudes. Si también agrega un,FilterRegistrationBean
también puede especificar servlets individuales y patrones de URL para aplicar.Nota:
A partir de Spring Boot 1.4,
FilterRegistrationBean
no está en desuso y simplemente movió paquetes deorg.springframework.boot.context.embedded.FilterRegistrationBean
aorg.springframework.boot.web.servlet.FilterRegistrationBean
fuente
Filter
en tu classpath. Normalmente, solo usaría elspring-boot-starter-web
para extraer todas las descripciones relevantes (por ejemplo, aquí ).Hay tres formas de agregar su filtro,
@Component
@Bean
conFilter
tipo en Spring@Configuration
@Bean
conFilterRegistrationBean
tipo en Spring@Configuration
El n. ° 1 o el n. ° 2 servirán si desea que su filtro se aplique a todas las solicitudes sin personalización; de lo contrario, use el n. ° 3. No necesita especificar la exploración de componentes para que el n. ° 1 funcione siempre y cuando coloque su clase de filtro en el mismo o subpaquete de su
SpringApplication
clase. Para el n. ° 3, el uso junto con el n. ° 2 solo es necesario cuando desea que Spring administre su clase de filtro, como tener dependencias cableadas automáticamente. Funciona bien para mí el nuevo filtro que no necesita ninguna conexión automática / inyección de dependencia.Aunque combinar # 2 y # 3 funciona bien, me sorprendió que no termine con dos filtros que se aplican dos veces. Supongo que Spring combina los dos beans como uno solo cuando llama al mismo método para crearlos. En caso de que quiera usar el n. ° 3 solo con el autoconexión, puede hacerlo
AutowireCapableBeanFactory
. Lo siguiente es un ejemplo,fuente
Filter
mientras se usaFilterRegistrationBean
ACTUALIZACIÓN: 2017-12-16:
Hay 2 formas simples de hacer esto en Spring Boot 1.5.8. LIBERACIÓN, sin necesidad de XML.
Primera forma: si no tiene ningún patrón de URL específico, puede usar @Component así: (El código completo y los detalles están aquí https://www.surasint.com/spring-boot-filter/ )
Segunda forma: si desea usar patrones de URL, puede usar @WebFilter de esta manera: (El código completo y los detalles están aquí https://www.surasint.com/spring-boot-filter-urlpattern/ )
Pero también debe agregar la anotación @ServletComponentScan en su clase @SpringBootApplication:
Tenga en cuenta que @Component es la anotación de Spring, pero @WebFilter no lo es. @WebFilter es la anotación Servlet 3.
En ambos sentidos, solo necesita una dependencia básica de Spring Boot en pom.xml (no es necesario un jasper incrustado de tomcat explícito)
ADVERTENCIA: La primera forma, si el Controlador en Spring Boot vuelve a un archivo JSP, la solicitud pasará el filtro dos veces.
Mientras que, en la segunda forma, la solicitud pasará el filtro solo una vez.
Prefiero la segunda forma porque es más similar al comportamiento predeterminado en la especificación de Servlet ( https://docs.oracle.com/cd/E19879-01/819-3669/6n5sg7b0b/index.html )
Puede ver más registros de prueba aquí https://www.surasint.com/spring-boot-webfilter-instead-of-component/
fuente
Filter
que se llama a la interfaz varias veces durante el lanzamiento de la aplicaciónContext. ¿Hay alguna forma de ejecutarlo solo una vez?Aquí hay un ejemplo de mi clase de filtro personalizada:
Y lo agregué a la configuración de arranque de Spring agregándolo a la clase de Configuración de la siguiente manera:
fuente
De Spring docs,
Contenedores de servlets integrados: agregue un servlet, filtro o escucha a una aplicación
P.ej:
Agregue esta
@Bean
configuración a su@Configuration
clase y el filtro se registrará al inicio.También puede agregar servlets, filtros y oyentes utilizando el escaneo classpath,
fuente
Si usa Spring Boot + Spring Security, puede hacerlo en la configuración de seguridad.
En el siguiente ejemplo, estoy agregando un filtro personalizado antes del UsernamePasswordAuthenticationFilter (ver todos los filtros predeterminados de Spring Security y su orden ).
Y la clase de filtro
fuente
Usando la anotación @WebFilter, se puede hacer de la siguiente manera:
fuente
Tenemos aproximadamente cuatro opciones diferentes para registrar un filtro usando Spring .
En primer lugar, podemos crear un filtro de implementación de Spring Bean o extender HttpFilter :
En segundo lugar, podemos crear un bean Spring extendiendo GenericFilterBean :
Alternativamente, podemos usar la clase FilterRegistrationBean :
Y, por último, podemos utilizar el @WebFilter anotación con @ServletComponentScan :
fuente
Es más un consejo que una respuesta, pero si está utilizando un Spring MVC en su aplicación web, la buena idea es utilizar Spring HandlerInterceptor en lugar de Filter
Puede hacer el mismo trabajo, pero también - Puede trabajar con ModelAndView - Sus métodos pueden llamarse antes y después del procesamiento de la solicitud, o después de la finalización de la solicitud.
- Se puede probar fácilmente
1 Implemente la interfaz HandlerInterceptor y agregue una anotación @Component a su clase
2 Configure su interceptor
fuente
Este filtro también lo ayudará a permitir el acceso de origen cruzado
fuente
Puede usar @WebFilter javax.servlet.annotation.WebFilter en una clase que implemente javax.servlet.Filter
Luego use @ServletComponentScan para registrarse
fuente
Vi muchas respuestas aquí pero no probé ninguna de ellas. Acabo de crear el filtro como en el siguiente código.
Y dejó la aplicación Spring Boot restante tal como estaba.
fuente
Necesita 2 cosas principales: - Agregar
@ServletComponentScan
a su clase principal: puede agregar un paquete llamado filtro dentro de él, crear unaFilter
clase que tenga lo siguiente:fuente
También puede hacer un filtro utilizando @WebFilter e implementa Filter, lo hará.
fuente
Los filtros, como su nombre indica, se utilizan para realizar el filtrado en la solicitud a un recurso o en la respuesta de un recurso, o en ambos. Spring Boot ofrece pocas opciones para registrar filtros personalizados en la aplicación Spring Boot. Veamos las diferentes opciones.
1. Definir filtro de arranque de resorte y orden de invocación
Implemente la interfaz de filtro para crear un nuevo filtro en Spring Boot.
Veamos rápidamente algunos puntos importantes en el código anterior.
Para disparar filtros en el orden correcto, necesitábamos usar la anotación @Order .
En el código anterior, CustomFirstFilter se ejecutará antes que CustomSecondFilter.
2. Patrón de URL
Si el mapeo basado en convenciones no es lo suficientemente flexible, podemos usar FilterRegistrationBean para el control completo de la aplicación. Aquí, no use la anotación @Component para la clase de filtro, pero registre el filtro usando un FilterRegistrationBean .
Registre el filtro personalizado con FilterRegistrationBean .
fuente
Debe implementar Filter y debe anotarse con @WebFilter (urlPatterns = "/ *")
Y en la clase Aplicación o Configuración, debe agregar @ServletComponentScan. De este modo, su filtro se registrará.
fuente
@WebFilter
es solo desde Servlet 3.0. Por lo tanto, podría no funcionar correctamente para 2.5Paso 1: Cree un componente de filtro implementando la interfaz de filtro.
Paso 2: establezca este filtro en los patrones de uri utilizando FilterRegistrationBean.
Puede consultar este enlace para completar la solicitud.
fuente
Primero, agregue
@ServletComponentScan
a su clase SpringBootApplication.En segundo lugar, cree un archivo de filtro que extienda el filtro o la clase de filtro de terceros y agréguelo
@WebFilter
a este archivo de esta manera:fuente
Vi la respuesta de @Vasily Komarov. Enfoque similar, pero usando la clase abstracta HandlerInterceptorAdapter en lugar de usar HandlerInterceptor .
Aquí hay un ejemplo...
fuente
Como todos saben, Spring Boot es una forma maravillosa de desarrollar una aplicación web o una aplicación independiente con una configuración mínima y una configuración obstinada.
Así es como he logrado un desarrollo de filtro web en la aplicación Spring Boot
Versión de Spring Boot: 2.0.4.RELEASE
Versión de Java: 8.0
Especificación del servlet: Servlet 3.0 (obligatorio e importante)
Declaré mi filtro web de la siguiente manera, cumpliendo con las especificaciones de Servlet 3.0
Esta es la forma programática de definir un filtro como reemplazo de las definiciones basadas en web.xml.
La anotación "@Webfilter" será procesada por el contenedor durante la implementación, la clase Filter en la que se encuentra se creará según la configuración y se aplicará a los patrones de URL, javax.servlet.Servlets y javax.servlet.DispatcherTypes.
Para implementar Spring Boot Application como "WAR tradicional", la clase de aplicación debe extender SpringBootServletInitializer.
NOTA :: SpringBootServletInitializer es una "Implementación programática" de web.xml con referencia a las especificaciones de Servlet 3.0+, que requiere una implementación de WebApplicationInitializer.
Por lo tanto, SpringBootApplication no requiere "web.xml" como su clase de aplicación (después de extender SpringBootServletInitializer) escanea para
- @WebFilter,
- @WebListener y
- @WebServlet.
Esta anotación permite escanear paquetes base para los componentes web anotados con @WebFilter, @WebListener y @WebServlet.
Debido al hecho de que los contenedores integrados no son compatibles con las anotaciones @WebServlet, @WebFilter y @WebListener, Spring Boot, confiando en gran medida en los contenedores integrados, introdujo esta nueva anotación @ServletComponentScan para admitir algunos frascos dependientes que usan estas 3 anotaciones.
El escaneo solo se realiza cuando se utiliza un contenedor de Servlet incorporado.
Aquí: he definido una clase personalizada: "ServletInitializer" que amplía la clase: SpringBootServletInitializer.
Como se explicó anteriormente, SpringBootServletInitializer es responsable de escanear anotaciones: -
- @WebFilter,
- @WebListener y
- @WebServlet.
Y, por lo tanto, la clase de aplicación Spring Boot debería
fuente
Los filtros se utilizan principalmente en los archivos de registro; varía según el registrador que utilice en el proyecto que Lemme explica para log4j2:
Los filtros se usan para restringir los datos y utilicé el filtro de umbral aún más para restringir los niveles de datos en el flujo. Mencioné los niveles que pueden restringirse allí. Para más información, consulte el orden de nivel de log4j2 - Log4J Levels: ALL> TRACE> DEBUG> INFO> WARN> ERROR> FATAL> OFF
fuente
FilterRegistrationBean
como se menciona en la pregunta se hace parajavax.servlet.Filter
, esta respuesta habla deorg.apache.logging.log4j.core.Filter