2012-06-25 9 views
7

Quiero usar dos contextos web diferentes de Spring, cada uno tiene su propia contextConfig, servlet de primavera y filtro, que se deben asignar a diferentes URL. Tengo un proyectoDos contextos Spring separados para una aplicación webapp

  1. Griales estándar, asigna a '/'
  2. Y una aplicación web de Primavera existente, que quiero asignar a /extra/

Sé que puede implementar tanto en un Tomcat , pero estoy buscando una forma de hacer una aplicación (una war, etc.), porque puede simplificar nuestra implementación y proceso de desarrollo.

Estas aplicaciones no necesitan compartir frijoles ni nada, deben estar completamente separadas. Ambos tienen DispatcherServlet y DispatcherFilter (y ambos usan Spring Security, pero con una configuración diferente)

¿Cómo puedo configurar web.xml para dicha aplicación web?

He intentado añadir nuevo filtro:

<filter> 
    <filter-name>extraSpringSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <init-param> 
     <param-name>contextAttribute</param-name> 
     <param-value>org.springframework.web.servlet.FrameworkServlet.CONTEXT.extraSpring</param-value> 
    </init-param> 
    <init-param> 
     <param-name>targetBeanName</param-name> 
     <param-value>extraSecurityFilterBean</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>extraSpringSecurityFilterChain</filter-name> 
    <url-pattern>/extra/*</url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

y despachador de primavera servlet:

<servlet> 
    <servlet-name>extraSpring</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    <init-param> 
     <param-name>springConfigLocation</param-name> 
     <param-value>classpath:extra-spring-web.xml</param-value> 
    </init-param> 
</servlet> 

Dónde: xml

  • dos contexto en ruta de clase (en el interior exra tarro de biblioteca):
    • extra-spring-w eb.xml
    • extra-spring-security.xml (!!! cómo debería configurarlo?)
  • extra-primavera-security.xml
    • es bastante estándar de configuración de la primavera de Seguridad
    • han configurado frijol extraSecurityFilterBean
    • tienen dependecy a los granos de contexto (-web pero no es necesario que sea)

está semi-trabajando ahora:

  • como veo a partir de troncos, extraSpring servlet se carga correctamente los granos de extra-spring-web.xml
  • pero después de acceder url /extra/ tengo NoSuchBeanDefinitionException: No se bean llamado 'extraSecurityFilterBean' se define.

Entonces, la pregunta, ¿cómo puedo definir el contexto para DelegatingFilterProxy? Incluso traté de agregar estos archivos al contexto principal (contextConfigLocation param), no es lo que estoy buscando, pero no funcionó.

He echado un vistazo a las fuentes de DelegatingFilterProxy, pero no está claro cómo carga el contexto.

+0

No creo que tengas que editar el archivo grails web.xml. Puede obtener lo que desea reproducir con Tomcat y Apache. Implemente las dos aplicaciones por separado en tomcat '/ app1' y '/ app2'. En Apache, todos los mapas solicitan '/ **' => '/ app1/**' excepto para aquellos con '/ extra/**' extra extra = **/app2/** ' –

+0

Sí, lo sé, gracias. Pero estoy seguro de que debería haber una manera de usar solo un web.xml/put both en uno WAR –

+0

¿Cómo está cargando 'extra-spring-security.xml'? No lo ha nombrado en su fragmento web.xml, ¿es un '' en 'extra-spring-web.xml'? –

Respuesta

2

Según mi comentario sobre la cuestión, si la cadena de filtros de seguridad se define en extra-spring-security.xml entonces usted necesita para asegurarse de que ese archivo es cargado por su DispatcherServlet extra además de extra-spring-web.xml ya sea por <import> ing -security el archivo de la -web uno o configurándola como:

<servlet> 
    <servlet-name>extraSpring</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      classpath:extra-spring-web.xml 
      classpath:extra-spring-security.xml 
     </param-value> 
    </init-param> 
</servlet> 

también necesito T o Asegúrese de que el filtro de seguridad en los Griales aplicación no se aplica a /extra URI, exactamente cómo se hace esto depende de si se está utilizando anotaciones, las entradas de la base de datos requestMap etc.

+0

Ian, ¡gracias! Tienes razón, está funcionando, no sé por qué no lo intento de esta manera. Todavía tengo problemas con los filtros de grails que también intentan procesar la url '/ extra', pero es otra pregunta –

+0

@IanRoberts Me encuentro con un problema similar (http://stackoverflow.com/q/23017839/827480). ¿Puede proporcionar información/referencias adicionales para evitar que el filtro de seguridad en Grails se aplique a la URL '/ extra'? Ese puede ser el enlace que me falta. –

0

algunas preguntas

  • Lo que se ve su configuración de la primavera de Seguridad como?
  • No estoy seguro de por qué el error indica "No se define bean llamado 'apiservSecurityFilterChain' pero el web.xml que ha publicado solo hace referencia a extraSpringSecurityFilterChain (los nombres de los beans deben coincidir o se deja fuera alguna configuración importante).

Posible respuesta

estoy adivinando el problema es que el filtro de nombre debe coincidir con el nombre de frijol de primavera de seguridad (no se puede saber con seguridad sin ver la configuración de Seguridad de la primavera que está utilizando). El valor por defecto utilizado por el espacio de nombres Spring Security es springSecurityFilterChain, a fin de tratar lo siguiente en el web.xml lugar (nótese extraSpringSecurityFilterChain cambió a springSecurityFilterChain):

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <init-param> 
     <param-name>contextAttribute</param-name> 
     <param-value>org.springframework.web.servlet.FrameworkServlet.CONTEXT.extraSpring</param-value> 
    </init-param> 
    <init-param> 
     <param-name>targetBeanName</param-name> 
     <param-value>extraSecurityFilterBean</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/extra/*</url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 
+0

¡Gracias! Sí, fue "No bean llamado 'extraSecurityFilterBean'", me mencionaron incorrectamente, lo siento.Este es un bean springSecurityFilterChanin predeterminado, denominado extraSecurityFilterBean (para diferenciar la cadena de filtros estándar de los griales). –

+0

Y no puedo usar el filtro nombrado como 'springSecurityFilterChain' porque ya está siendo utilizado por otra cadena de filtros de seguridad de primavera (de Grails) –

1

Si los módulos están completamente por separado: la forma más fácil es empaquetarlos como dos aplicaciones web diferentes. Decenas de diferentes aplicaciones basadas en la primavera se pueden ejecutar en un servidor de aplicaciones, incluso en una modesta máquina desarrolladora, sin problemas.

+0

Lo sé, gracias. Pero estoy buscando una manera de cómo combinarlos en uno. piénsalo, ya que tengo que implementarlo en algunos servidores PaaS, y puedo implementarlo solo como una aplicación –

Cuestiones relacionadas