CXF獲取及傳遞Header數據

首先吐槽一句,網上的各位“大神”,你們的代碼或者轉載前都測試過嗎?或者哪怕你說一下你的環境(版本)也好啊!

服務端獲取Header數據

先說一說我的是什麼Header數據(以下圖片來自於soapUI工具,CXF包爲3.2.5):

1、添加自定義Header數據

2、通過RAW模式查看我們的Header。非上圖中XML代碼中的<soap:Header>

OK,這就是我們自定義的Header。下面看看是怎麼獲取的。

public class ReadSoapHeader extends AbstractPhaseInterceptor<SoapMessage> {

    public ReadSoapHeader() {
        super(Phase.PRE_PROTOCOL);
        getAfter().add(SAAJInInterceptor.class.getName());
    }

    public void handleMessage(SoapMessage message) throws Fault {
    	TreeMap<String, ArrayList<Object>> tree = (TreeMap<String, ArrayList<Object>>) message.get(Message.PROTOCOL_HEADERS);
    	System.out.println("==============="+(tree.get("username").get(0)));
    }
}

是不是感覺很簡單,對,沒錯,其實就是這麼簡單。至於我是怎麼發現使用這種方式的?當然是萬能的debug了,通過debug模式查看message裏面到底有什麼東西?

通過上面的debug我們可以看到message是Map模式,通過get(key),可以獲得相應的值。再次發現key爲Message.PROTOCOL_HEADERS,返回的是TreeMap型,而TreeMap的key就是我們定義的Header中的key,只是value是ArrayList類型。

雖然只是簡單的問題,但是盡信書,不如無書啊。不要懷疑自己,有可能是方法不對!!!

客戶端傳遞數據

同服務端一樣的道理,在服務端在Map裏面取,我們就在客戶端往Map裏面塞數據:

public class SoapHeaderInterceptor extends AbstractSoapInterceptor
{
    public SoapHeaderInterceptor()
    {
        super(Phase.WRITE);
    }

    public void handleMessage(SoapMessage message) throws Fault
    {
        TreeMap<String, ArrayList<String>> map = (TreeMap<String, ArrayList<String>>)message.get(Message.PROTOCOL_HEADERS);
        ArrayList<String> al = new ArrayList<String>();
        al.add("111");
        ArrayList<String> a2 = new ArrayList<String>();
        a2.add("222");
        map.put("username", al);
        map.put("password" , a2);
        
    }
}
    public static void main(String[] args) {
    	 URL wsdlURL = UserServiceService.WSDL_LOCATION;
        
    	 UserServiceService ss = new UserServiceService(wsdlURL, SERVICE_NAME);
    	 IUserService port = ss.getUserServicePort();  
         System.out.println("Invoking queryStations...");
         
         Client client = ClientProxy.getClient(port);
         client.getOutInterceptors().add(new SoapHeaderInterceptor());
        
         String user = port.getUser();
         System.out.println("user = " + user);

	}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章