Veo esto en mi Spring MVC aplicación web.xml:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

Estoy tratando de averiguar por qué existe y si es realmente necesario.

He encontrado esta explicación en la Primavera docs pero no me ayuda hacer sentido de ella:

Parece sugerir que este componente es el «pegamento» entre los servlets se define en web.xml y los componentes definidos en la Primavera applicationContext.xml.

7.1 DelegatingFilterProxy

Cuando se utiliza servlet filtros, obviamente usted tiene que declararlos en su web.xml, o que será ignorado por el contenedor de servlets. En la Primavera de de Seguridad, las clases de filtro también la Primavera de frijoles se define en el contexto de la aplicación y por lo tanto capaz de tomar ventaja de la Primavera del rico de la dependencia de instalaciones de inyección y del ciclo de vida de las interfaces. La primavera del DelegatingFilterProxy proporciona el vínculo entre la web.xml y el contexto de aplicación.

Cuando se utiliza DelegatingFilterProxy, vas a ver algo como esto en el web.xml de 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 un DelegatingFilterProxy, y no de la clase que realmente implementar la lógica del filtro. Lo DelegatingFilterProxy hace es delegar el Filtro de los métodos a través de un bean, el cual es obtenido a partir de la Primavera en el contexto de aplicación. Esto permite que el grano a beneficio de la Primavera en la web en el contexto de aplicación del ciclo de vida de soporte y flexibilidad de configuración. El grano debe implementar javax.servlet.Filter y debe tener el mismo nombre que en el filtro de nombre de elemento. Leer el Javadoc para DelegatingFilterProxy para obtener más información

Así que, si me tomo esto de mi web.xml, ¿qué sucederá? Mi servlets no ser capaz de comunicarse con el Muelle de contenedores?**

InformationsquelleAutor Thomas | 2011-07-17

7 Comentarios

  1. 123

    Hay algún tipo de magia aquí, pero al final, todo es un determinista programa.

    La DelegatingFilterProxy es un Filtro como se ha explicado anteriormente, cuyo objetivo es «delegar a una Primavera-managed bean que implementa la interfaz del Filtro de«, es decir, se encuentra un bean («target bean» o «delegado») en su Primavera en el contexto de aplicación y la invoca. ¿Cómo es posible? Debido a que este grano implementa javax.servlet.Filtro, su método doFilter se llama.

    Que bean se llama? el DelegatingFilterProxy «Admite un «targetBeanName» […], especificando el nombre de la meta de frijol en la Primavera en el contexto de aplicación.»

    Como se vio en su web.xml que el bean nombre es «springSecurityFilterChain«.

    Así, en el contexto de una aplicación web, un Filtro crea una instancia de un bean llamado «springSecurityFilterChain» en su contexto de aplicación y, a continuación, delegado a través de la doFilter() método.

    Recuerde, su contexto de aplicación se define con TODAS LAS de la APLICACIÓN de CONTEXTO de los archivos (XML). Por ejemplo: applicationContext.xml Y applicationContext-security.xml.

    Así que trate de encontrar un bean llamado «springSecurityFilterChain» en el último…

    …y probablemente usted no puede (por ejemplo, si se ha seguido un tutorial o si se ha configurado la seguridad mediante el uso de Roo)

    Aquí está la magia: hay un nuevo elemento para la configuración de la seguridad, algo así como

    <http auto-config="true" use-expressions="true"> 

    como es permitido por http://www.springframework.org/schema/security/spring-security-3.0.xsd, hará el truco.

    Cuando la Primavera se carga el contexto de la aplicación el uso de archivos XML, si se encuentra un elemento, se intentará establecer la seguridad HTTP, es decir, un filtro de la pila y URLs protegidas y para el registro de la FilterChainProxy denominado «springSecurityFilterChain».

    Alternativamente, usted puede definir el bean en el modo clásico, que es:

    <beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">

    Pero es menos recomendable, ya que se necesita para hacer un montón de configuración (todos los filtros que se van a utilizar. Y hay más de una docena de ellos)

    • excelente explicación.
    • «applicationContext-security.xml Y applicationContext-security.xml» es el mismo nombre de archivo dos veces.
    • Gracias musiKk (creo que se puede editar el post directamente)
    • Esta fue la explicación que me estaba mirando todo el tiempo y borra las cosas para mí.
    • Thx user871611.
    • Tienes razón, pero yo no estaba seguro de cuál es la versión correcta debe ser. Tiendo a dejar que el autor original a arreglar para no cambiar inadvertidamente el significado.
    • OK. En cualquier caso, agradezco mucho su ayuda para mejorar mi respuesta. Gracias de nuevo, musiKk
    • si tengo dos granos implementa la interfaz del Filtro en applicationContext, y quiero ejecutar en un orden, entonces, ¿cómo puedo hacerlo?
    • De tu post entiendo por qué se debería implementar DelegatingFilterProxy, me puede sugerir algún enlace donde puedo conseguir su aplicación.Gracias

  2. 66

    ¿Sabes qué es un Servlet Filtro es y cómo funciona? Es una forma muy útil de la pieza de la Especificación Servlet, lo que nos permite aplicar AOP-como conceptos para el servicio de mantenimiento de las peticiones HTTP. Muchos marcos de Filtro de uso de las implementaciones para diversas cosas, y no es raro encontrar implementaciones personalizadas de ellos porque son muy sencillos de escribir y útil. En la Primavera de aplicación, la mayoría de las cosas que su aplicación puede hacer es en la Primavera de frijoles. Una instancia de Filtro, sin embargo, es controlada por el contenedor de servlets. El contenedor crea, se inicializa, y la destruye. El Servlet Especificación no requiere ningún tipo de Muelle de integración, aunque, por lo que está a la izquierda con un concepto útil (Filtros) con ninguna forma práctica de atar a su Primavera de la aplicación y los frijoles que hacer el trabajo.

    Entrar en el DelegatingFilterProxy. Escribe un Filtro de aplicación y hacer de él un Manantial de frijol, pero en lugar de añadir su propia clase de Filtro a la web.xml, utilice el DelegatingFilterProxy, y darle el bean nombre del filtro en el contexto de la Primavera. (Si no se dispone explícitamente un nombre, se utiliza el filtro «nombre».) Luego en tiempo de ejecución, el DelegatingFilterProxy se encarga de la complejidad de la búsqueda de la implementación real – el que escribió y configurado en la Primavera y el enrutamiento de solicitudes para la misma. Así que en tiempo de ejecución, es como si se había incluido el filtro en el web.xml, pero usted consigue la ventaja de ser capaz de alambre como cualquier otra Primavera bean.

    Si usted toma el filtro de la asignación de su web.xml todo va a seguir trabajando, pero ninguno de su Url será segura. (Eso suponiendo que el nombre de «springSecurityFilterChain» describe con precisión lo que hace.) Eso es porque esta asignación es el filtrado de cada petición entrante y de entregar a un filtro de seguridad que se define en el contexto de la primavera.

    • Gracias por publicar este iluminador comentario. Estoy aprendiendo Spring Security ahora, tratando de entender lo suficiente como para hacer personalizaciones. Yo no tenía idea de lo que servlet filtros o lo que salta los filtros. Su poco acerca de la AOP deja en claro por QUÉ habría de filtros en lugar de utilizar servlets……..así que usted no tiene que escribir el mismo pre/post proceso una y otra vez en cada servlet/recursos
    • Wow. Que la explicación es exactamente lo que yo necesitaba. Gracias por compartir tus conocimientos.
    • Stewart si tengo dos granos implementa la interfaz del Filtro en applicationContext, y quiero ejecutar en un orden, entonces, ¿cómo puedo hacerlo?
    • si tengo dos granos implementa la interfaz del Filtro en applicationContext, y quiero ejecutar en un orden, entonces, ¿cómo puedo hacerlo?
  3. 41

    ¿Cuáles son Servlet Filtros?

    Servlet filtros son, en general, un Java WebApp concepto. Usted puede tener servlet filtros en cualquier aplicación web, ya sea o no el uso de Spring framework en su aplicación.

    Estos filtros pueden interceptar las peticiones antes de llegar a la meta servlet. Puede implementar la funcionalidad común, como la autorización, en servlet filtros. Una vez implementado, se puede configurar el filtro de su web.xml para ser aplicado a cada servlet, a petición específica de los patrones de url o de todos los patrones de url.

    Donde servlet se utilizan filtros?

    Modernas aplicaciones web pueden tener docenas de este tipo de filtros. Cosas como la autorización, el almacenamiento en caché, ORM, gestión de sesiones, y la inyección de dependencia se realizan a menudo con la ayuda de un filtro de servlets. Todos estos filtros es necesario estar registrado en web.xml.

    Instancias de Servlet Filtros – sin Framework Spring

    Su contenedor de servlet crea instancias de Filtros declarado en web.xml y los llama en los momentos apropiados (es decir, cuando el servicio de servlet de solicitudes). Ahora, si usted es como la mayoría de la Inyección de dependencias (DI) de los fans, lo más probable es decir que la creación de instancias es lo que mi DI marco (la Primavera), no mejor. No puedo conseguir que mi servlet filtros creados con la Primavera por lo que son susceptibles a todos los DI bondad?

    DelegatingFilterProxy, por lo que la Primavera se crea el filtro instancias

    Aquí es donde DelegatingFilterProxy pasos. DelegatingFilterProxy es un impelmentation de la javax.servlet.Filter interfaz proporcionada por el Framework Spring. Una vez que configure DelegatingFilterProxy en web.xml, puede declarar la real frijoles que hacer el filtrado en la primavera de configuración. De esta manera, la Primavera crea las instancias de beans que el filtrado, y usted puede utilizar DI para configurar estos granos.

    Tenga en cuenta que usted sólo necesita un único DelegatingFilterProxy declaración en web.xml pero puede tener varios filtrado beans encadenados juntos en su contexto de aplicación.

    • muy bien explicado.
  4. 14

    La cosa es que el servlet filtros son gestionados por el contenedor de servlets, y no por la primavera. Y puede que tenga que inyectar un poco de primavera componentes en sus filtros.

    Así que, si necesitas algo como:

    public class FooFilter {
    
        @Inject
        private FooService service;
    
        public void doFilter(....) { .. }
    
    }

    entonces usted necesita el delegar filtro proxy.

  5. 0

    He quedado perplejo por «springSecurityFilterChain» en web.xml y encontré esta respuesta en springframework documento de seguridad:

    La <http> elemento que encapsula la configuración de seguridad de la capa de web de su aplicación. >Se crea una FilterChainProxy bean llamado «springSecurityFilterChain» que mantiene la pila de >filtros de seguridad que componen la web, de la configuración de seguridad [19]. Algunos filtros de núcleo son siempre >creado y demás será añadido a la pila dependiendo de los atributos de los elementos secundarios que son >el presente. Las posiciones de los filtros estándar son fijos (ver el filtro de la tabla de la orden en la >espacio de nombres de la introducción), la eliminación de una fuente común de errores con las versiones anteriores del framework >cuando los usuarios configurar el filtro de la cadena explícitamente en theFilterChainProxy bean. Usted puede, de >por supuesto, hacer esto si usted necesita control total de la configuración.

    Aquí está el enlace http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html

  6. 0

    Ha sido un largo tiempo, pero tenía la misma pregunta y me encontré con esto: https://www.javacodegeeks.com/2013/11/spring-security-behind-the-scenes.html

    Traté de correr mi primavera del proyecto de seguridad, quitando el filtro en cuestión y también por la adición. Lo que he encontrado es que si podemos agregar el filtro, sólo entonces la llamada se redirigirá a la página de inicio de sesión requerido, como se define en la primavera-configuración de seguridad.

    Por lo tanto, estando de acuerdo con @Ryan respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here