8

2 つの異なる Spring Web コンテキストを使用したいと考えています。それぞれに独自の contextConfig、Spring サーブレット、およびフィルターがあり、異なる URL にマップする必要があります。私は

  1. '/' にマッピングされた標準 Grails プロジェクト
  2. そして、マップしたい既存のSpring Webアプリ/extra/

両方を 1 つの Tomcat にデプロイできることはわかっていますが、1 つのアプリ (1 つなど) を作成する方法を探してい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>

そして春のディスパッチャーサーブレット:

<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>

どこ:

  • クラスパス内の 2 つのコンテキスト xml (exra ライブラリ jar 内):
    • extra-spring-web.xml
    • extra-spring-security.xml ( !!!どのように設定すればよいですか?)
  • extra-spring-security.xml
    • かなり標準的なSpring Security構成です
    • Beanを構成しましたextraSecurityFilterBean
    • -web コンテキストからの Bean への依存関係があります (ただし、そうである必要はありません)

それは今半作業です:

  • ログからわかるように、extraSpringサーブレットは Bean を正常にロードしますextra-spring-web.xml
  • /extra/しかし、URLにアクセスした後、NoSuchBeanDefinitionException「extraSecurityFilterBean」という名前のBeanが定義されていません。

それで、質問、コンテキストを定義するにはどうすればよいDelegatingFilterProxyですか?このファイルをメイン コンテキスト (contextConfigLocation param) に追加しようとしましたが、探しているものではありませんが、機能しませんでした。

DelegatingFilterProxy ソースを調べましたが、コンテキストをロードする方法が明確ではありません。

4

3 に答える 3

2

質問に対する私のコメントによると、セキュリティ フィルタ チェーンが定義されている場合は、-web ファイルから -security ファイルを ing するか、次のように設定することextra-spring-security.xmlに加えて、追加の DispatcherServlet によってそのファイルがロードされるようにする必要があります。extra-spring-web.xml<import>

<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アプリケーションのセキュリティ フィルターがURI に適用されないようにする必要があり/extraます。正確にこれを行う方法は、アノテーション、データベースの RequestMap エントリなどを使用しているかどうかによって異なります。

于 2012-06-29T09:20:10.437 に答える
1

モジュールが完全に分離されている場合: 最も簡単な方法は、それらを 2 つの異なる webapp としてパッケージ化することです。数十の異なる Spring ベースのアプリを 1 つのアプリサーバーで (控えめな開発者マシンでも) 問題なく実行できます。

于 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 に答える