2013-02-05 116 views
9

我正在使用Netbeans基於WSDL文件自動創建Web服務客戶端。這很好,除了我使用的web服務要求我將HTTP頭中的自定義cookie傳遞給每個web服務以證明我的身份。JAX-WS客戶端:維護跨多個服務的會話/ Cookie

我使用一個名爲Utility的web服務來獲得我的授權。這設置了一個cookie,它需要在隨後的任何web服務調用中提供。

這可以通過在Web服務的端口的BindingProvider上將javax.xml.ws.session.maintain設置爲true來完成。這對後續調用Utility webservice中的方法非常有用。 問題是,這隻能維持該單一web服務的會話/ cookie。我也需要它。

我需要將cookie傳遞給單獨的 webservice命名爲History我該怎麼做到這一點?有一個超級服務類可以實用和歷史擴展並共享相同的會話狀態嗎?

回答

14

我找到了解決方案。

你可以使用此響應頭,你所做的調用之後:

((BindingProvider)port).getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS); 

找到Set-Cookie頭和存儲其價值。

然後(在任何Web服務),你的下一個請求之前,您可以設置Cookie標題:

((BindingProvider)port).getRequestContext().put(
      MessageContext.HTTP_REQUEST_HEADERS, 
       Collections.singletonMap("Cookie", Collections.singletonList(cookieValue) 
      ) 
     ); 
+0

也許你必須補充說,這種方式提取cookie只能在第一次調用後直接進行 - 因爲只有在那裏設置了「Set-Cookie」。但毫無疑問......非常感謝你。這節省了我很多時間。 – cljk

3

就因爲評論溶液上並沒有爲我工作。我得到了UnsupportedOperationException。我相信問題是由於singletonMap不允許更改而引起的。 xml頭文件也是需要的,所以我先設置它們。

Map<String, List<String>> headers= CastUtils.cast((Map)port.getRequestContext().get("javax.xml.ws.http.request.headers")); 
if (headers == null) { 
    headers = new HashMap<String, List<String>>(); 
    port.getRequestContext().put("javax.xml.ws.http.request.headers", headers); 
} 

headers.put("Cookie", Collections.singletonList(cookieValue)); 
((BindingProvider)port).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, headers); 
+0

是的,SingletonMaps是不可變的 - 我只是爲了方便而使用它 – bradvido

+1

您應該查看代碼以使它更緊湊,知道MessageContext.HTTP_REQUEST_HEADERS ==「javax.xml.ws.http.request.headers」 –

+0

他的版本實際上是一個字符甚至包括引號,但我知道你的意思。使用常數肯定是更安全的。 :) – Martin

相關問題