繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM