Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个webapp有两个独立的Spring上下文_Java_Spring_Grails_Spring Security - Fatal编程技术网

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

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

我想使用两个不同的SpringWeb上下文,每个上下文都有自己的contextConfig、SpringServlet和filter,应该映射到不同的URL。我有一个

  • 标准Grails项目,映射到“/”
  • 还有一个现有的SpringWebApp,我想映射到
    /extra/
  • 我知道我可以将两者部署到一个Tomcat中,但我正在寻找一种方法来制作一个应用程序(一个
    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上下文(但不是必需的)
    它现在正在半工作:

    • 正如我从日志中看到的,
      extraSpring
      servlet成功地从
      extraspringweb.xml
    • 但是在访问url之后,我得到了一个名为“extraSecurityFilterBean”的bean
    那么,问题是,我如何定义
    DelegatingFilterProxy
    的上下文?我甚至尝试将这些文件添加到主上下文(contextConfigLocation参数),这不是我想要的,但它不起作用

    我已经研究了DelegatingFilterProxy源代码,但不清楚它如何加载上下文。

    几个问题
    • 您的Spring安全配置是什么样子的
    • 我不明白为什么错误会说“没有定义名为'apiservSecurityFilterChain'的bean”,但您发布的web.xml只引用了extraSpringSecurityFilterChain(bean名称应该匹配,或者忽略了一些重要的配置)
    可能的答案 我猜问题在于过滤器名称需要匹配SpringSecurity的bean名称(如果没有看到您正在使用的SpringSecurity配置,就无法确定)。Spring安全命名空间使用的默认值是springSecurityFilterChain,因此请改为在web.xml中尝试以下操作(请注意,extraSpringSecurityFilterChain已更改为springSecurityFilterChain):

    
    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>