CXF拦截器
拦截动态操作请求和响应数据
拦截器分类
- 位置:服务器端拦截器,客户端拦截器
- 消息方向:入拦截器 出拦截器
- 定义者:系统拦截器 自定义拦截器:LoggingInInteceptor
①:创建webservice服务端的自定义入拦截器,用于检查客户端传入的参数:
package com.zhiwei.ws.imp;
import java.util.List;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
public class DefineInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
public DefineInterceptor() {
super(Phase.PRE_PROTOCOL);
}
//<head> <name>zhiwei<name></head>
@Override
public void handleMessage(SoapMessage msg) throws Fault {
//获取文件头
List<Header> headers=msg.getHeaders();
SoapHeader header=(SoapHeader) headers.get(0);
Element element=(Element) header.getObject();
String name=element.getElementsByTagName("name").item(0).getTextContent();
if("xiaoyang".equals(name)) {
System.out.println("Server interceptor.........."+name);
return;
}
throw new Fault(new RuntimeException("用户名不正确!"));
}
}
②:配置服务端的拦截器:引入CXF实现的日志记录拦截器,启动服务端
String address = "http://localhost:8888/webservice";
// 终端发布web服务:SEI实现类
Endpoint endpoint = Endpoint.publish(address, new HelloWSImp());
// 终端控制拦截器
EndpointImpl endpointImpl = (EndpointImpl) endpoint;
// 配置入拦截器:将拦截器加入到拦截器集合:日志拦截器
List<Interceptor<? extends Message>> inIterceptors = endpointImpl.getInInterceptors();
inIterceptors.add(new LoggingInInterceptor());
inIterceptors.add(new DefineInterceptor());
List<Interceptor<? extends Message>> outIterceptors = endpointImpl.getOutInterceptors();
outIterceptors.add(new LoggingOutInterceptor());
System.out.println("server is deploying!");
服务端控制台日志:
③:创建客户端自定义拦截器
package com.zhiwei.ws.client;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.xml.utils.DOMHelper;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@SuppressWarnings("deprecation")
public class DefineInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private String name;
public DefineInterceptor(String name) {
super(Phase.PRE_PROTOCOL); // 准备协议时拦截
this.name = name;
}
/*
* <Envelop> <head> <name>zhiwei<name> </head> <soapenv:Body> <q0:sayHello>
* <arg0>china</arg0> </q0:sayHello> </soapenv:Body> </Envelop>
*/
@Override
public void handleMessage(SoapMessage msg) throws Fault {
List<Header> headers=msg.getHeaders(); //获取soap的头信息
/* soap消息头:
* <head>
* <zhiwei>
* <name>zhiwei<name>
* <zhiwei>
* </head>
*/
Document document=DOMHelper.createDocument();
Element root=document.createElement("zhiwei");
//Qname给标签添加一个独一无二的名字:类似别名
Element element=document.createElement("name");
element.setTextContent(name);
root.appendChild(element);
headers.add(new Header(new QName("root"), root));
System.out.println("DefineInterceptor Interceptor:--------->running!");
}
}
④:配置客户端拦截器,并且启动客户端
HelloWSImpService helloWSImpService=new HelloWSImpService();
HelloWS helloWS=helloWSImpService.getHelloWSImpPort();
//返回服务类的代理接口
Client client=ClientProxy.getClient(helloWS);
List<Interceptor<? extends Message>> outIterceptors=client.getOutInterceptors();
outIterceptors.add(new DefineInterceptor("xiaoyang"));
String result=helloWS.sayHello("--->China!");
System.out.println(result);
客户端控制台日志:
服务端控制台日志:
分析:服务端日志明显可看出,webservice是根据soap协议进行通信,并且服务端客户端配置的 拦截器都实现了拦截功能
SOAP: 特殊形式的Http请求形式