一个webapp的两个单独的Spring上下文

Igo*_*nov 8 java grails spring spring-security

我想使用两个不同的Spring Web上下文,每个都有自己的contextConfig,spring servlet和filter,应该映射到不同的url.我有一个

  1. 标准Grails项目,映射到'/'
  2. 还有一个现有的Spring webapp,我想映射到它 /extra/

我知道我可以将两者都部署到一个Tomcat中,但我正在寻找一种制作一个应用程序(一个war等)的方法,因为它可以简化我们的部署和开发过程.

这个应用程序不需要共享bean或任何东西,应该完全分开.两者都有DispatcherServlet和DispatcherFilter(两者都使用Spring Security,但配置不同)

我如何配置web.xml这样的webapp?

我试图添加新的过滤器:

<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>
Run Code Online (Sandbox Code Playgroud)

和spring 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>
Run Code Online (Sandbox Code Playgroud)

哪里:

  • classpath中的两个上下文xml(在exra库jar中):
    • 额外的弹簧-web.xml中
    • extra-spring-security.xml(!!!我应该怎么配置它?)
  • 外弹簧security.xml文件
    • 是相当标准的Spring Security配置
    • 配置了bean extraSecurityFilterBean
    • 从-web上下文中依赖于bean(但不是必须的)

它现在半工作:

  • 正如我从日志中看到的那样,extraSpringservlet成功加载了beanextra-spring-web.xml
  • 但是在访问url之后/extra/我得到了NoSuchBeanDefinitionException:没有定义名为'extraSecurityFilterBean'的bean.

那么,问题是,我如何定义上下文DelegatingFilterProxy?我甚至试图将这些文件添加到主上下文(contextConfigLocation param)中,它不是我正在寻找的,但它不起作用.

我已经看了DelegatingFilterProxy源代码,但我不清楚它是如何加载上下文的.

Ian*_*rts 3

根据我对这个问题的评论,如果定义了安全过滤器链,那么除了通过以下方式之一extra-spring-security.xml之外,您还需要确保该文件由额外的 DispatcherServlet 加载extra-spring-web.xml<import>文件中的 -security 文件或将其配置为:

<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>
Run Code Online (Sandbox Code Playgroud)

您还需要确保Grails应用程序中的安全过滤器不适用于/extraURI,具体如何执行此操作取决于您是否使用注释、数据库 RequestMap 条目等。