11

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

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

这可以通过将 Web 服务端口的 BindingProvider设置javax.xml.ws.session.maintain为来完成。true这对于后续调用Utilityweb 服务中的方法非常有用。问题是这仅维护该单个 Web 服务的会话/cookie。我也需要它。

我需要将 cookie 传递给名为 How can I done this?的单独Web 服务?History拥有一个实用程序和历史都可以扩展并共享相同会话状态的超级服务类是否可行?

4

2 回答 2

17

我找到了解决方案。

拨打电话后,您可以使用它获取响应标头:

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

找到Set-Cookie标头并存储其值。

然后在您的下一个请求(在任何网络服务中)之前,您可以设置 Cookie 标头:

((BindingProvider)port).getRequestContext().put(
            MessageContext.HTTP_REQUEST_HEADERS,
                Collections.singletonMap("Cookie", Collections.singletonList(cookieValue)
            )
        );
于 2013-02-05T14:47:54.450 回答
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); 
于 2014-06-11T19:23:14.623 回答