2012-06-25 1 views
7

Desidero utilizzare in due diversi contesti Web Spring, ciascuno con propri contextConfig, servlet di primavera e filtro, che devono essere mappati su URL diversi. Ho un progettoDue contesti Spring separati per una webapp

  1. Grails standard, mappato '/'
  2. E una webapp Primavera esistente, che voglio mappare /extra/

So che posso schierare entrambi in un unico Tomcat , ma sto cercando un modo per creare un'app (uno war, ecc.), perché può semplificare il nostro processo di implementazione e sviluppo.

Queste applicazioni non hanno bisogno di condividere i fagioli o altro, dovrebbero essere completamente separati. Entrambi hanno DispatcherServlet e DispatcherFilter (ed entrambi utilizzano Spring Security, ma configurazione diversa)

Come posso configurare web.xml per tale webapp?

ho cercato di aggiungere nuovo 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> 

e la primavera dispatcher 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> 

Dove:

  • due contesto xml nel classpath (all'interno barattolo biblioteca exra):
    • extra-molla-w eb.xml
    • extra-spring-security.xml (!!! come dovrei configurarlo?)
  • extra-primavera-security.xml
    • è abbastanza standard config Primavera di sicurezza
    • hanno configurato fagioli extraSecurityFilterBean
    • hanno dependecy di fagioli di contesto (-web ma non è necessario che sia)

E 'semi-ora di lavoro:

  • come la vedo da tronchi, extraSpring servlet caricare con successo i fagioli da extra-spring-web.xml
  • ma dopo l'accesso url /extra/ ho ottenuto NoSuchBeanDefinitionException: No fagiolo di nome 'extraSecurityFilterBean' è definito.

Quindi, la domanda, come posso definire il contesto per DelegatingFilterProxy? Ho anche provato ad aggiungere questi file nel contesto principale (contextConfigLocation param), non è quello che sto cercando, ma non ha funzionato.

Ho dato un'occhiata ai sorgenti DelegatingFilterProxy, ma non è chiaro per me come carica il contesto.

+0

Non penso che sia necessario modificare grails web.xml. Puoi ottenere ciò che vuoi giocare con tomcat e apache. Distribuire le due applicazioni separate in tomcat '/ app1' e '/ app2'. In apache mappa tutte le richieste a '/ **' => '/ app1/**' ad eccezione di quelle con extra '/ extra/**' => '/ app2/**' –

+0

Sì, lo so, grazie. Ma sono sicuro che ci dovrebbe essere un modo per usare solo un web.xml/metterli entrambi in un WAR –

+0

Come stai caricando 'extra-spring-security.xml'? Non lo hai nominato nel tuo snippet web.xml, è un '' in 'extra-spring-web.xml'? –

risposta

2

Come per il mio commento sulla questione, se la catena dei filtri di sicurezza è definito in extra-spring-security.xml allora avete bisogno di assicurare che tale file viene caricato dal tuo DispatcherServlet supplementare oltre a extra-spring-web.xml sia da <import> ing file -Sicurezza dal -web uno o configurandolo come:

<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> 

avrete anche bisogno di t o assicurarsi che il filtro di sicurezza nei Grails applicazione non si applica ai /extra URI, esattamente come si esegue questa operazione dipende dal fatto che si sta utilizzando le annotazioni, le voci del database requestMap ecc

+0

Ian, grazie! Hai ragione, sta funzionando, non so perché non ci provo in questo modo. Sto ancora avendo problemi con i filtri Grails che cercano anche di elaborare l'URL '/ extra', ma è un'altra domanda –

+0

@IanRoberts Sto correndo in un problema simile (http://stackoverflow.com/q/23017839/827480). Potete fornire ulteriori informazioni/riferimenti per evitare che il filtro di sicurezza in Grails si applichi all'URL '/ extra'? Questo potrebbe essere il collegamento che mi manca. –

0

alcune domande

  • Che cosa fa il tuo look configurazione di Primavera di sicurezza come?
  • Sono confuso perché l'errore indica "Nessun bean denominato 'apiservSecurityFilterChain' è definito" ma il web.xml che hai pubblicato contiene solo riferimenti extraSpringSecurityFilterChain (i nomi dei bean devono corrispondere o qualche configurazione importante viene lasciata fuori).

possibile risposta

Sto indovinando il problema è che il filtro-nome deve corrispondere al nome di fagioli di Primavera di sicurezza (non si può sapere con certezza senza vedere la configurazione Primavera di sicurezza che si sta utilizzando). Il valore di default utilizzato dal namespace Primavera di sicurezza è springSecurityFilterChain, in modo da provare quanto segue nel web.xml invece (Avviso extraSpringSecurityFilterChain cambiato in 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

Grazie! Sì, era "Nessun bean chiamato 'extraSecurityFilterBean'", mi è stato detto in modo errato, mi dispiace.Questo è un bean springSecurityFilterChanin predefinito, chiamato extraSecurityFilterBean (per fare la differenza tra la catena di filtri standard da Grails). –

+0

E non posso usare il filtro denominato 'springSecurityFilterChain' perché è già utilizzato da un'altra catena di filtri di sicurezza (dai graal) –

1

Se i moduli sono completamente separate: il modo più semplice è di comprimerle come due diverse webapp. Decine di diverse app basate sulla primavera possono essere eseguite in un appserver, anche su una modesta macchina per sviluppatori, senza problemi.

+0

Lo so, grazie. Ma sto cercando un modo in cui posso unirli in uno solo. pensateci come devo implementare in alcuni hosting PaaS, e posso distribuire solo come un'unica app –