Veo esto en mi aplicación Spring MVC web.xml
:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
Estoy tratando de averiguar por qué está ahí y si realmente es necesario.
Encontré esta explicación en los documentos de Spring pero no me ayuda a darle sentido:
Parece sugerir que este componente es el "pegamento" entre los servlets definidos en web.xml
y los componentes definidos en Spring applicationContext.xml
.
7.1 Delegación de filtro proxy
Cuando use filtros de servlets, obviamente debe declararlos en su
web.xml
, o serán ignorados por el contenedor de servlets. En Spring Security, las clases de filtro también son beans de Spring definidos en el contexto de la aplicación y, por lo tanto, pueden aprovechar las ricas instalaciones de inyección de dependencias y las interfaces de ciclo de vida de Spring. SpringDelegatingFilterProxy
proporciona el vínculo entreweb.xml
y el contexto de la aplicación.Al usar DelegatingFilterProxy, verá algo como esto en el
web.xml
archivo:<filter> <filter-name>myFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Observe que el filtro es en realidad a
DelegatingFilterProxy
, y no la clase que realmente implementará la lógica del filtro. Lo queDelegatingFilterProxy
hace es delegar los métodos del filtro a través de un bean que se obtiene del contexto de la aplicación Spring. Esto permite que el bean se beneficie del soporte del ciclo de vida del contexto de la aplicación web Spring y la flexibilidad de configuración. El bean debe implementarsejavax.servlet.Filter
y debe tener el mismo nombre que el del elemento filter-name. Lea el Javadoc para DelegatingFilterProxy para obtener más información
Entonces, si saco esto de mi web.xml
, ¿qué pasará? ¿Mis servlets no podrán comunicarse con el contenedor Spring? **
fuente
¿Sabes qué es un filtro de servlet? y cómo funciona? Es una pieza muy útil de Servlet Spec, que nos permite aplicar conceptos similares a AOP al servicio de solicitudes HTTP. Muchos marcos usan implementaciones de filtros para varias cosas, y no es raro encontrar implementaciones personalizadas de ellos porque son muy simples de escribir y útiles. En una aplicación de Spring, la mayoría de las cosas que puede hacer su aplicación están en sus beans de Spring. Sin embargo, una instancia de Filtro está controlada por el contenedor Servlet. El contenedor lo instancia, lo inicializa y lo destruye. Sin embargo, Servlet Spec no requiere ningún tipo de integración Spring, por lo que te queda un concepto realmente útil (Filtros) sin una forma conveniente de vincularlo a tu aplicación Spring y los beans que hacen el trabajo.
Introduzca DelegatingFilterProxy. Usted escribe una implementación de Filtro y la convierte en un bean Spring, pero en lugar de agregar su propia clase Filter al web.xml, usa DelegatingFilterProxy y le da el nombre del bean de su filtro en el contexto Spring. (Si no proporciona explícitamente un nombre, utiliza el "nombre-filtro"). Luego, en tiempo de ejecución, DelegatingFilterProxy maneja la complejidad de encontrar la implementación real, la que escribió y configuró en Spring, y enrutar las solicitudes a ella. . Entonces, en tiempo de ejecución, es como si hubiera incluido su filtro en web.xml, pero obtiene el beneficio de poder conectarlo como cualquier otro bean Spring.
Si elimina ese mapeo de filtro de su web.xml, todo seguirá funcionando, pero ninguna de sus URL estará protegida. (Eso es asumiendo que el nombre "springSecurityFilterChain" describe con precisión lo que hace). Eso es porque este mapeo está filtrando cada solicitud entrante y entregándola a un filtro de seguridad que está definido en su contexto Spring.
fuente
¿Qué son los filtros de servlet?
Los filtros de servlet son, en general, un concepto de aplicación web Java. Puede tener filtros de servlet en cualquier aplicación web, ya sea que use Spring Framework en su aplicación o no.
Estos filtros pueden interceptar solicitudes antes de que lleguen al servlet de destino. Puede implementar funciones comunes, como la autorización, en filtros de servlets. Una vez implementado, puede configurar el filtro en su web.xml para que se aplique a un servlet específico, patrones de URL de solicitud específicos o todos los patrones de URL.
¿Dónde se utilizan filtros de servlets?
Las aplicaciones web modernas pueden tener docenas de estos filtros. Cosas como la autorización, el almacenamiento en caché, la administración de sesiones de ORM y la inyección de dependencias a menudo se implementan con la ayuda del filtro de servlets. Todos estos filtros deben estar registrados en
web.xml
.Creación de instancias de filtros de servlet, sin Spring Framework
Su contenedor de servlets crea instancias de filtros declarados
web.xml
y los llama en los momentos adecuados (es decir, cuando atiende solicitudes de servlets). Ahora, si usted es como la mayoría de los fanáticos de la inyección de dependencia (DI), probablemente diría que la creación de instancias es lo que hace mejor mi marco DI (Spring). ¿No puedo crear mis filtros de servlets con Spring para que sean compatibles con todas las bondades de DI?DelegatingFilterProxy
, para que Spring cree sus instancias de filtroAquí es donde
DelegatingFilterProxy
intervienen los pasos.DelegatingFilterProxy
Es un impulso de lajavax.servlet.Filter
interfaz proporcionada por Spring Framework. Una vez que configureDelegatingFilterProxy
en web.xml, puede declarar los beans reales que hacen el filtrado en su configuración de primavera. De esta forma, Spring crea las instancias de beans que realizan el filtrado real, y puede usar DI para configurar estos beans.Tenga en cuenta que solo necesita una
DelegatingFilterProxy
declaración,web.xml
pero puede tener varios filtrosbean
encadenados en el contexto de su aplicación.fuente
El caso es que los filtros de servlets son administrados por el contenedor de servlets y no por resorte. Y es posible que deba inyectar algunos componentes de resorte en sus filtros.
Entonces, si necesita algo como:
entonces necesitas el proxy de filtro delegado.
fuente
Tienes razón sobre las cosas del 'pegamento'. Como está escrito en JavaDocs de FilterChainProxy :
Consulte la sección FIlterChainProxy del blog Behind the Spring Security Namespace para obtener una excelente explicación.
fuente
Me ha dejado perplejo "springSecurityFilterChain" en web.xml y encontré esta respuesta en el documento de seguridad de springframework:
Aquí está el enlace http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html
fuente
Ha pasado mucho tiempo, pero tenía la misma pregunta y encontré esto: https://www.javacodegeeks.com/2013/11/spring-security-behind-the-scenes.html
Intenté ejecutar mi proyecto de seguridad de primavera quitando el filtro en cuestión y también agregándolo. Lo que encontré es que si agregamos el filtro, solo entonces la llamada se redirigirá a la página de inicio de sesión requerida como se define en la configuración de seguridad de primavera.
Por lo tanto, estoy de acuerdo con la respuesta de @ Ryan.
fuente