Java 一个webapp有两个独立的Spring上下文
我想使用两个不同的SpringWeb上下文,每个上下文都有自己的contextConfig、SpringServlet和filter,应该映射到不同的URL。我有一个Java 一个webapp有两个独立的Spring上下文,java,spring,grails,spring-security,Java,Spring,Grails,Spring Security,我想使用两个不同的SpringWeb上下文,每个上下文都有自己的contextConfig、SpringServlet和filter,应该映射到不同的URL。我有一个 标准Grails项目,映射到“/” 还有一个现有的SpringWebApp,我想映射到/extra/ 我知道我可以将两者部署到一个Tomcat中,但我正在寻找一种方法来制作一个应用程序(一个war,等等),因为它可以简化我们的部署和开发过程 这个应用程序不需要共享bean或任何东西,应该完全分开。两者都有DispatcherSer
/extra/
war
,等等),因为它可以简化我们的部署和开发过程
这个应用程序不需要共享bean或任何东西,应该完全分开。两者都有DispatcherServlet和DispatcherFilter(都使用Spring安全性,但配置不同)
如何为此类webapp配置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>
extraSpringSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
上下文属性
org.springframework.web.servlet.FrameworkServlet.CONTEXT.extraSpring
塔吉特比纳姆
extraSecurityFilterBean
extraSpringSecurityFilterChain
/额外的/*
向前地
要求
和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>
外弹簧
org.springframework.web.servlet.DispatcherServlet
1.
springConfigLocation
类路径:extra-spring-web.xml
其中:
- 类路径中的两个上下文xml(在exra库jar中):
- extra-spring-web.xml
- extra-spring-security.xml(!!!我应该如何配置它?)
- extra-spring-security.xml
- 是相当标准的Spring安全配置
- 已配置bean
extraSecurityFilterBean
- 依赖于bean from-web上下文(但不是必需的)
- 正如我从日志中看到的,
servlet成功地从extraSpring
extraspringweb.xml
- 但是在访问url之后,我得到了一个名为“extraSecurityFilterBean”的bean
DelegatingFilterProxy
的上下文?我甚至尝试将这些文件添加到主上下文(contextConfigLocation参数),这不是我想要的,但它不起作用
我已经研究了DelegatingFilterProxy源代码,但不清楚它如何加载上下文。几个问题
- 您的Spring安全配置是什么样子的
- 我不明白为什么错误会说“没有定义名为'apiservSecurityFilterChain'的bean”,但您发布的web.xml只引用了extraSpringSecurityFilterChain(bean名称应该匹配,或者忽略了一些重要的配置)
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
上下文属性
org.springframework.web.servlet.FrameworkServlet.CONTEXT.extraSpring
塔吉特比纳姆
extraSecurityFilterBean
springSecurityFilterChain
/额外的/*
向前地
要求
根据我对这个问题的评论,如果安全过滤器链是在extra-spring security.xml
中定义的,那么除了extra-spring web.xml
之外,您还需要确保该文件是由额外的DispatcherServlet加载的,方法是从-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>
外弹簧
org.springframework.web.servlet.DispatcherServlet
1.
上下文配置位置
类路径:extra-spring-web.xml
类路径:extra-spring-security.xml
您还需要确保Grails应用程序中的安全过滤器不适用于
/extra
URI,具体操作方式取决于您是否使用注释,数据库请求映射条目等。如果模块完全独立:最简单的方法是将它们打包为两个不同的webapp。数十种不同的基于spring的应用程序可以在一台appserver上运行,即使是在一台普通的开发人员机器上也不会出现问题。我认为您不必编辑grails web.xml。通过使用tomcat和apache,您可以获得想要的东西。在tomcat“/app1”和“/app2”中部署这两个独立的应用程序。在apache中,将所有请求映射到“/**”=>“/app1/**”,除了那些带有额外“/extra/**”=>“/app2/**”的请求之外。是的,我知道,谢谢。但是我相信应该有一种方法可以只使用一个web.xml/将两者都放在一个战争中。您如何加载extra-spring-security.xml
?您还没有在web.xml代码段中命名它,它是extra-spring web.xml
中的
吗?@IanRoberts是的,这就是问题所在,我不知道如何加载extra-spring-security.xml
。它应该由SpringSecurityFilterChain
使用,但我不明白如何为itI配置上下文路径。我的意思是,我没有尝试过不同的选项,但没有找到任何工作队列!是的,它是“没有名为‘extraSecurityFilterBean’的bean”,我被错误地提到了它,对不起。这是一个默认的springSecurityFilterChanin bean,名为extraSecurityFilterBean(用于区分grails中的标准筛选器链)。我不能使用名为“springSecurityFilterChain”的筛选器,因为我知道另一个spring安全筛选器链(来自grails)已经在使用它,谢谢。但我正在寻找一种方法,如何将它们合并为一个。
<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>