gpt4 book ai didi

java - 一个 webapp 有两个独立的 Spring 上下文

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:56 26 4
gpt4 key购买 nike

我想使用两个不同的 Spring web 上下文,每个都有自己的 contextConfig、spring servlet 和过滤器,它们应该映射到不同的 url。我有一个

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

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

这个应用程序不需要共享 beans 或任何东西,应该是完全独立的。两者都有 DispatcherServlet 和 DispatcherFilter(并且都使用 Spring Security,但配置不同)

如何为这样的 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>

和 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 中):
    • extra-spring-web.xml
    • extra-spring-security.xml(!!!我应该如何配置它?)
  • extra-spring-security.xml
    • 是非常标准的 Spring Security 配置
    • 已配置 bean extraSecurityFilterBean
    • 依赖于来自-web 上下文的bean(但这不是必须的)

现在是半工作状态:

  • 正如我从日志中看到的,extraSpring servlet 成功地从 extra-spring-web.xml 加载 beans
  • 但是在访问 url /extra/ 之后,我得到了 NoSuchBeanDefinitionException:没有定义名为“extraSecurityFilterBean”的 bean。

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

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

最佳答案

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

关于java - 一个 webapp 有两个独立的 Spring 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11184724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com