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