8

我想使用两个不同的 Spring web contexts,每个都有自己的 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>

和 spring 调度程序 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>

在哪里:

  • 类路径中的两个上下文 xml(在 exra 库 jar 中):
    • 额外的弹簧 web.xml
    • extra-spring-security.xml ( !!!我应该如何配置它?)
  • 额外的spring-security.xml
    • 是非常标准的 Spring Security 配置
    • 已配置beanextraSecurityFilterBean
    • 对来自 -web 上下文的 bean 有依赖(但不是必须的)

它现在处于半工作状态:

  • 正如我从日志中看到的那样,extraSpringservlet 成功地从extra-spring-web.xml
  • 但在访问 url 后,/extra/我得到NoSuchBeanDefinitionException:没有定义名为“extraSecurityFilterBean”的 bean。

那么,问题是,我如何定义上下文DelegatingFilterProxy?我什至尝试将此文件添加到主上下文(contextConfigLocation 参数)中,这不是我想要的,但它没有用。

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

4

3 回答 3

2

根据我对这个问题的评论,如果在中定义了安全过滤器链,extra-spring-security.xml那么您需要确保该文件由您的额外 DispatcherServlet 加载,除了extra-spring-web.xml通过<import>从 -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应用程序中的安全过滤器不适用于/extraURI,具体操作方式取决于您是否使用注释、数据库 RequestMap 条目等。

于 2012-06-29T09:20:10.437 回答
1

如果模块完全分离:最简单的方法是将它们打包为两个不同的 webapp。数十个不同的基于 spring 的应用程序可以在一个应用程序服务器中运行——即使在一台普通的开发人员机器上——也不会出现问题。

于 2012-06-29T09:25:19.710 回答
0

几个问题

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

可能的答案

我猜问题是过滤器名称需要与 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>
于 2012-06-27T02:42:21.670 回答