[英]JAX-WS client: maintain session/cookies across multiple services
我正在使用Netbeans根據WSDL文件自動創建Web服務客戶端。 這很好用,除了我正在使用的Web服務要求我將HTTP標頭中的自定義cookie傳遞給每個Web服務以證明我的身份。
我使用一個名為Utility
Web服務來獲得我的授權。 這將設置一個cookie,在隨后對任何Web服務的所有調用中都需要提供該cookie。
這可以通過在Web服務端口的BindingProvider上將javax.xml.ws.session.maintain
設置為true
來實現。 這對於后續調用Utility
Webservice中的方法非常有用。 問題在於,這僅維護單個Web服務的會話/ cookie。 我也需要其他人。
我需要將Cookie傳遞到名為History
的單獨的 Web服務中,該如何實現? 具有實用程序和歷史記錄都可以擴展並共享相同會話狀態的超級服務類是否可行?
我找到了解決方案。
撥打電話后,可以使用以下方法獲取響應頭:
((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)
)
);
只是發表評論是因為上面的解決方案對我不起作用。 我收到了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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.