我正在使用Netbeans根据WSDL文件自动创建Web服务客户端。这很好用,除了我正在使用的web服务要求我将HTTP头中的自定义cookie传递给每个web服务以证明我的身份。
我使用一个名为Utility
的网络服务来获取我的授权。这将设置一个cookie,需要在对任何Web服务的所有后续调用中提供。
这可以通过在Web服务的端口的BindingProvider上设置javax.xml.ws.session.maintain
到true
来实现。这适用于后续调用Utility
webservice中的方法。
问题是这只维护该单个Web服务的会话/ cookie。我也需要其他人。
我需要将cookie传递给名为History
的单独的 web服务我该如何实现?拥有一个超级服务类是可行的,实用程序和历史记录都可以扩展并与?
答案 0 :(得分:16)
我找到了解决方案。
您可以在拨打电话后使用此功能获取响应标头:
((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)
)
);
答案 1 :(得分:4)
只是评论,因为上面的解决方案对我不起作用。我得到了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);