CXF自定义验证拦截器,自定义响应无法正常工作

时间:2013-06-13 14:11:46

标签: java web-services cxf

我正在尝试编写一个自定义CXF拦截器来对Web服务的SOAP请求进行一些验证。根据验证结果,我想阻止对Web服务的请求并返回带有一些修改参数的响应。

为此,我编写了从AbstractPhaseInterceptor扩展的自定义CXF ininterceptor,以便在进行验证的阶段USER_LOGICAL中运行,但是我无法停止对Web服务的后续调用,也无法传递自定义响应对象(自定义响应对象类型与Web服务返回类型相同)。我怎么能用拦截器做到这一点?

3 个答案:

答案 0 :(得分:1)

我对nadirsaghar的提示进行了一些研究,我发现它是可用的清洁解决方案。在JAX-WS中使用message.getExchange()是一件非常痛苦的事情,因为您必须自己设置管道并填写响应消息...

使用HttpServletResponse以这种方式做得更好。 - 你需要在你的Path上有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 );
    }
}

答案 1 :(得分:0)

您可以使用abort方法

中止拦截链的执行,包括Web服务
public void handleMessage(SoapMessage message) {

    InterceptorChain chain = message.getInterceptorChain();
    chain.abort();
}

答案 2 :(得分:0)

像这样的东西,没有必要使用Interceptor链。

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

}