攔截動態操做請求和響應數據java
①:建立webservice服務端的自定義入攔截器,用於檢查客戶端傳入的參數:web
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實現的日誌記錄攔截器,啓動服務端apache
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!");
服務端控制檯日誌:服務器
③:建立客戶端自定義攔截器app
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!"); } }
④:配置客戶端攔截器,而且啓動客戶端dom
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);
客戶端控制檯日誌:ide
服務端控制檯日誌:this
分析:服務端日誌明顯可看出,webservice是根據soap協議進行通訊,而且服務端客戶端配置的 攔截器都實現了攔截功能spa
SOAP: 特殊形式的Http請求形式3d