2

Spring WS に 2 つのエンドポイント インターセプターを備えた Web サービスがあります。XML構成は次のようになります

<sws:interceptors>
    <bean class="org.someorg.security.SignatureInterceptor"/>
    <bean class="org.someorg.common.LoggingInterceptor">
        <constructor-arg value="logger_1"/>
    </bean>    
</sws:interceptors>

SignatureInterceptor は、着信 SOAP エンベロープの署名を検証し、発信 SOAP エンベロープに署名します。

LoggingInterceptor は、生の SOAP データ (バイト配列) をデータベースに格納します。

LoggingInterceptor の前に SignatureInterceptor を呼び出す必要があり、この方法でインターセプター Bean を作成すると、問題が解決すると予想されます。ただし、ログ メッセージによると、LoggingInterceptor が最初に呼び出されるため、署名されていないデータがデータベースに格納されます。

次に、構成を変更し、Bean 宣言を交換するだけで、期待どおりに機能し始めました

<sws:interceptors>
    <bean class="org.someorg.common.LoggingInterceptor">
        <constructor-arg value="logger_1"/>
    </bean>    
    <bean class="org.someorg.security.SignatureInterceptor"/>    
</sws:interceptors>

しかし、このケースは私には明らかではありません。インターセプターの呼び出し順序を明示的に設定するにはどうすればよいですか?

4

1 に答える 1

3

順序は指定したとおりにする必要があります (特定のエンドポイント URL にマップされている場合を除き、その場合は最後に処理されます) - handleResponse が処理される順序は、handlRequest の逆であることに注意してください。 -

理想的には、次のように表示されるはずです。

  1. SignatureInterceptor.handleRequest(..)
  2. LoggingInterceptor.handleRequest(..)
  3. エンドポイントがリクエストを処理する
  4. LoggingInterceptor.handleResponse()
  5. SignatureInterceptor.handleResponse()

小さなテストを試してみましたが、同じように機能します。

于 2012-10-04T13:21:43.733 に答える