JAX-WS客户端:跨多个服务维护会话/ cookie

时间:2013-02-05 02:19:04

标签: java cookies jax-ws session-cookies jax-ws-customization

我正在使用Netbeans根据WSDL文件自动创建Web服务客户端。这很好用,除了我正在使用的web服务要求我将HTTP头中的自定义cookie传递给每个web服务以证明我的身份。

我使用一个名为Utility的网络服务来获取我的授权。这将设置一个cookie,需要在对任何Web服务的所有后续调用中提供。

这可以通过在Web服务的端口的BindingProvider上设置javax.xml.ws.session.maintaintrue来实现。这适用于后续调用Utility webservice中的方法。 问题是这只维护该单个Web服务的会话/ cookie。我也需要其他人。

我需要将cookie传递给名为History单独的 web服务我该如何实现?拥有一个超级服务类是可行的,实用程序和历史记录都可以扩展并与?

共享相同的会话状态

2 个答案:

答案 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。我认为问题是因为s​​ingletonMap不允许更改。还需要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);