使用CXF爲Web Service添加攔截器,自定義攔截器

攔截器分爲Service端Client端

    攔截器是在發送soap消息包的某一個時機攔截soap消息包,對soap消息包的數據進行分析或處理。分爲CXF自帶的攔截器自定義的攔截器 java

一、Service端:
apache

經過將org.apache.cxf.jaxws.EndpointImpl類的方法便可實現 frontend

  發佈Web Service 方法能夠經過Endpoint.publish()方法,此方法返爲EndpointImpl,因此爲Service端添加攔截器很簡單。 spa

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()); //此攔截器是自定義的攔截器。



二、Client端
客戶端能夠經過對org.apache.cxf.frontend.ClientProxy中的getClient()方法獲取
org.apache.cxf.endpoint.Client對象,該對象能夠爲客戶端添攔截器。 code

//爲客戶端添加攔截器
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"));



三、自定義的攔截器 對象

  自定義攔截器須要繼承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);
        }    
    }
}
相關文章
相關標籤/搜索