我正在尝试编写一个自定义CXF拦截器来对Web服务的SOAP请求进行一些验证。根据验证结果,我想阻止对Web服务的请求并返回带有一些修改参数的响应。
为此,我编写了从AbstractPhaseInterceptor扩展的自定义CXF ininterceptor,以便在进行验证的阶段USER_LOGICAL中运行,但是我无法停止对Web服务的后续调用,也无法传递自定义响应对象(自定义响应对象类型与Web服务返回类型相同)。我怎么能用拦截器做到这一点?
答案 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
方法
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);
}