我想使用两个不同的Spring Web上下文,每个都有自己的contextConfig,spring servlet和filter,应该映射到不同的url。我有一个
/extra/
我知道我可以将两者都部署到一个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>
其中:
extraSecurityFilterBean
现在正在半工作:
extraSpring
servlet已成功从extra-spring-web.xml
/extra/
后,我得到NoSuchBeanDefinitionException
:没有定义名为'extraSecurityFilterBean'的bean。那么,问题是,我如何定义DelegatingFilterProxy
的上下文?我甚至试图将这些文件添加到主上下文(contextConfigLocation param)中,它不是我正在寻找的,但它不起作用。
我已经看了一下DelegatingFilterProxy来源,但我不清楚它是如何加载上下文的。
答案 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)
我猜测问题是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>