拦截器分为Service端和Client端
拦截器是在发送soap消息包的某一个时机拦截soap消息包,对soap消息包的数据进行分析或处理。分为CXF自带的拦截器和自定义的拦截器
1、Service端:
通过将org.apache.cxf.jaxws.EndpointImpl类的方法即可实现
发布Web Service 方法可以通过Endpoint.publish()方法,此方法返为EndpointImpl,所以为Service端添加拦截器很简单。
部分代码:
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()); //此 拦截器是自定义的 拦截器。
ep.getOutInterceptors()
.add( new LoggingOutInterceptor());
ep.getInInterceptors()
.add( new LoggingInInterceptor());
ep.getInInterceptors()
.add( new AuthIntercetpr()); //此 拦截器是自定义的 拦截器。
2、Client端
客户端可以通过对org.apache.cxf.frontend.ClientProxy中的getClient()方法获取org.apache.cxf.endpoint.Client对象,该对象可以为客户端添拦截器。
部分代码
//为客户端添加拦截器
org.apache.cxf.endpoint.Client client = ClientProxy.getClient(us);
client.getInInterceptors().add( new LoggingInInterceptor());
client.getOutInterceptors().add( new LoggingOutInterceptor());
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"));
client.getOutInterceptors().add( new AddHeaderInterceptor( "crazyit" , "crazyit.org2"));
3、自定义的拦截器
自定义拦截器需要继承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);
}
}
}
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);
}
}
}
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow