拦截器是在发送soap消息包的某一个时机拦截soap消息包,对soap消息包的数据进行分析或处理。分为CXF自带的拦截器和自定义的拦截器 java
一、Service端:
apache
经过将org.apache.cxf.jaxws.EndpointImpl类的方法便可实现 frontend
发布Web Service 方法能够经过Endpoint.publish()方法,此方法返为EndpointImpl,因此为Service端添加拦截器很简单。 spa
UserService us = new UserServiceImpl(); String address = "http://192.168.10.254:9999/crazyit"; EndpointImpl ep = (EndpointImpl)Endpoint.publish(address , us); //下面方法就能够添加拦截器(CXF提供的拦截器) //cxf-2.2.10.jar org.apache.cxf.interceptor.* (CXF提供的拦截器) ep.getOutInterceptors() .add(new LoggingOutInterceptor()); ep.getInInterceptors() .add(new LoggingInInterceptor()); ep.getInInterceptors() .add(new AuthIntercetpr()); //此拦截器是自定义的拦截器。
二、Client端
客户端能够经过对org.apache.cxf.frontend.ClientProxy中的getClient()方法获取org.apache.cxf.endpoint.Client对象,该对象能够为客户端添拦截器。 code
//为客户端添加拦截器 org.apache.cxf.endpoint.Client client = ClientProxy.getClient(us); client.getInInterceptors().add(new LoggingInInterceptor()); client.getOutInterceptors().add(new LoggingOutInterceptor()); //自定义拦截器 client.getOutInterceptors().add(new AddHeaderInterceptor("crazyit" , "crazyit.org2"));
三、自定义的拦截器 对象
自定义拦截器须要继承org.apache.cxf.phase.AbstractPhaseInterceptor抽象类,并实现其handleMessage方法,与重写自定义的构造器(因为AbstractPhaseInterceptor没有无参构造器,因此要在自定义构拦截器的造器中调用supper(带参数))。 继承
public class AuthIntercetpr extends AbstractPhaseInterceptor<SoapMessage> { public AuthIntercetpr() { //子类总会调用父类的构造器, //默认是调用无参数的构造器。 //指定该拦截器在哪一个阶段被激发 super(Phase.PRE_INVOKE); } //处理消息 public void handleMessage(SoapMessage message) { System.out.println("==================" + message); //获取SOAP消息的所有头 List<Header> headers = message.getHeaders(); if(headers.size() < 1) { throw new Fault(new SOAPException("SOAP消息头格式不对哦!")); } for(Header header : headers) { SoapHeader soapHeader = (SoapHeader)header; //取出SOAP的Header元素 Element element = (Element)soapHeader.getObject(); checkSOAPHeader(element); } } }