【CXF】- 攔截器 Interceptor

CXF攔截器

攔截動態操做請求和響應數據java

攔截器分類

  • 位置:服務器端攔截器,客戶端攔截器
  • 消息方向:入攔截器 出攔截器
  • 定義者:系統攔截器 自定義攔截器:LoggingInInteceptor

①:建立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

相關文章
相關標籤/搜索