0

カスタム CXF インターセプターを作成して、Web サービスへの SOAP 要求でいくつかの検証を実行しようとしています。検証結果に基づいて、Web サービスへの要求をブロックし、いくつかの変更されたパラメーターを含む応答を返したいと考えています。

このために、AbstractPhaseInterceptor から拡張されたカスタム CXF ininterceptor を作成し、フェーズ USER_LOGICAL で実行して検証を行いましたが、Web サービスへの後続の呼び出しを停止できず、カスタム応答オブジェクト (カスタム応答オブジェクト) を渡すこともできません。 type は Web サービスの戻り値の型と同じです)。インターセプターを使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

1

私はnadirsagharからのヒントについていくつかの調査を行い、それが利用可能なクリーンソリューションであることがわかりました. JAX-WS で message.getExchange() を使用するのは、コンジットをセットアップして自分で応答メッセージを入力する必要があるため、完全に苦痛です...

したがって、HttpServletResponse を使用して、この方法で実行することをお勧めします。- パスに Java servlet-api.jar が必要です。Maven を使用せずに開発している場合は、Web サーバー (Tomcat など) のディレクトリからリンクするだけで、デプロイメントからは除外します。

<!-- With Maven add the following dependency -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <!-- The version should match your WebService version e.g. 3.0 for JDK7-->
    <version>2.5</version>
    <scope>provided</scope>
</dependency>

スコープが提供されると、デプロイされずに利用できるため、HttpServletResponse クラスにアクセスできます。

ハンドラー コード:

@Override
public void handleMessage( final Message message ) throws Fault
{
    if( shouldBlockMessage( message ) )
    {
        message.getInterceptorChain().abort();

        final HttpServletResponse response = (HttpServletResponse)message.get( AbstractHTTPDestination.HTTP_RESPONSE );

        // To redirect a user to a different Page
        response.setStatus( HttpServletResponse.SC_MOVED_TEMPORARILY );
        response.setHeader( "Location", "http://www.bla.blubb/redirectPage" );

        // Other possibility if a User provides faulty login data
        response.setStatus( HttpServletResponse.SC_FORBIDDEN );
    }
}
于 2014-06-06T08:52:36.677 に答える
0

abortメソッドを使用して、Webサービスを含むinterceptorChainの実行を中止できます

public void handleMessage(SoapMessage message) {

    InterceptorChain chain = message.getInterceptorChain();
    chain.abort();
}
于 2013-06-13T18:06:29.980 に答える
0

このようなもの、インターセプター チェーンで遊ぶ必要はありません。

public void handleMessage(Message message) {
   //your logic
   Response response = Response.status(Status.UNAUTHORIZED).type(MediaType.APPLICATION_JSON).build();
   message.getExchange().put(Response.class, response);

}
于 2013-06-14T06:38:00.163 に答える