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

时间:2012-06-25 06:59:30

标签: java spring grails spring-security

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

  1. 标准Grails项目,映射到'/'
  2. 现有的Spring webapp,我要映射到/extra/
  3. 我知道我可以将两者都部署到一个Tomcat中,但我正在寻找一种制作一个应用程序(一个war等)的方法,因为它可以简化我们的部署和开发过程。

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

    如何为此类网址配置web.xml

    我尝试添加新的过滤器:

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

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

    其中:

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

    现在正在半工作:

    • 从日志中可以看出,extraSpring servlet已成功从extra-spring-web.xml
    • 加载bean
    • 但在访问url /extra/后,我得到NoSuchBeanDefinitionException:没有定义名为'extraSecurityFilterBean'的bean。

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

    我已经看了一下DelegatingFilterProxy来源,但我不清楚它是如何加载上下文的。

3 个答案:

答案 0 :(得分:2)

根据我对该问题的评论,如果在extra-spring-security.xml中定义了安全过滤器链,那么除了extra-spring-web.xml之外,您还需要确保<import>之外的额外DispatcherServlet加载该文件。 1)从-web获取-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>

您还需要确保 Grails 应用程序中的安全过滤器不适用于/extra URI,具体方法取决于您是否使用注释,数据库RequestMap条目等。

答案 1 :(得分:1)

如果模块完全分开:最简单的方法是将它们打包为两个不同的webapp。数十种不同的基于Spring的应用程序可以在一个appserver中运行 - 即使是在适度的开发人员计算机上 - 也没有问题。

答案 2 :(得分:0)

几个问题

  • 您的Spring Security配置是什么样的?
  • 我很困惑,为什么错误状态“没有定义名为'apiservSecurityFilterChain'的bean”,但是你发布的web.xml只引用了extraSpringSecurityFilterChain(bean名称应该匹配,或者遗漏了一些重要的配置)。

可能的答案

我猜测问题是filter-name需要匹配Spring Security的bean名称(如果没有看到你正在使用的Spring Security配置,就无法确定)。 Spring Security命名空间使用的默认值是springSecurityFilterChain,因此请在web.xml中尝试以下内容(注意extraSpringSecurityFilterChain已更改为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>