更新時間:2020-09-18 17:20:17 來源:動力節(jié)點 瀏覽1284次
Web Service的攔截器分為Service端和Client端,攔截器是在發(fā)送soap消息包的某一個時機攔截soap消息包,對soap消息包的數(shù)據(jù)進行分析或處理。用CXF為Web Service添加攔截器的方式有兩種分別為為CXF自帶的攔截器和自定義的攔截器。
1.Service端:
通過將org.apache.cxf.jaxws.EndpointImpl類的方法即可實現(xiàn)
發(fā)布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()); //此攔截器是自定義的攔截器。
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());
//自定義攔截器
client.getOutInterceptors().add(new AddHeaderInterceptor("crazyit" , "crazyit.org2"));
3.自定義的攔截器
自定義攔截器需要繼承org.apache.cxf.phase.AbstractPhaseInterceptor 抽象類,并實現(xiàn)其handleMessage方法,與重寫自定義的構(gòu)造器(由于AbstractPhaseInterceptor 沒有無參構(gòu)造器,所以要在自定義構(gòu)攔截器的造器中調(diào)用supper(帶參數(shù)))。
部分代碼
public class AuthIntercetpr extends AbstractPhaseInterceptor
public AuthIntercetpr() {
//子類總會調(diào)用父類的構(gòu)造器,
//默認是調(diào)用無參數(shù)的構(gòu)造器。
//指定該攔截器在哪個階段被激發(fā)
super(Phase.PRE_INVOKE);
}
//處理消息
public void handleMessage(SoapMessage message) {
System.out.println("==================" + message);
//獲取SOAP消息的全部頭
List
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);
}
}
}
以上就是CXF為Web Service添加攔截器的方法,這三種攔截器各有優(yōu)劣勢,我們在選用的過程中可以根據(jù)實際需求擇優(yōu)選取,以達到更好的代碼編寫效果。