Java 具有自定义响应的CXF自定义验证侦听器不工作

Java 具有自定义响应的CXF自定义验证侦听器不工作,java,web-services,cxf,Java,Web Services,Cxf,我正试图编写一个定制的CXF拦截器来对web服务的SOAP请求进行一些验证。根据验证结果,我想阻止对web服务的请求,并返回带有一些修改参数的响应 为此,我编写了从AbstractPhaseInterceptor扩展而来的自定义CXF-ininterceptor,以在phase USER_LOGICAL中运行,它进行验证,但我无法停止对web服务的后续调用,也无法传递自定义响应对象(自定义响应对象类型与web服务返回类型相同)。如何使用拦截器执行此操作?您可以使用abort方法中止拦截器链(包括

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


为此,我编写了从AbstractPhaseInterceptor扩展而来的自定义CXF-ininterceptor,以在phase USER_LOGICAL中运行,它进行验证,但我无法停止对web服务的后续调用,也无法传递自定义响应对象(自定义响应对象类型与web服务返回类型相同)。如何使用拦截器执行此操作?

您可以使用
abort
方法中止拦截器链(包括Web服务)的执行

public void handleMessage(SoapMessage message) {

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

像这样的东西,没有必要玩拦截器链

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

}

我对纳迪尔萨哈尔的贴片做了一些研究,发现它是可用的清洁溶液。在JAX-WS中使用message.getExchange()是一件非常痛苦的事情,因为您必须自己设置一个管道并填充响应消息

所以最好这样做,使用HttpServletResponse您的路径上需要有Javaservlet-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>

我尝试了这个,但它完全停止了拦截器链,而没有返回响应。停止拦截器链后有没有办法传递自定义响应?@Sumit:我想您可以通过从
message.get(AbstractHttpDestination.HTTP\u response)获取引用来直接操作HttpServletResponse。
我刚刚检查了response对象是否属于RestFul web服务包。它是否也适用于SOAP服务?哦,我错过了那部分。。我还没有使用过SOAP,所以我只能猜测SOAP框架中的响应肯定也有类似之处,您必须找出答案。
@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 );
    }
}