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

Posted

技术标签:

【中文标题】JAX-WS 客户端:跨多个服务维护会话/cookie【英文标题】:JAX-WS client: maintain session/cookies across multiple services 【发布时间】:2013-01-19 21:11:29 【问题描述】:

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

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

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

我需要将 cookie 传递给一个名为History单独 web 服务我如何才能做到这一点?是否有一个超级服务类,实用程序和历史都可以扩展并共享相同的会话状态?

【问题讨论】:

【参考方案1】:

我找到了解决办法。

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

((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)
            )
        );

【讨论】:

也许你必须补充一点,以这种方式提取 Cookie 只能在第一次调用后直接进行 - 因为只设置了“Set-Cookie”。但是……非常感谢。这为我节省了很多时间。【参考方案2】:

只是评论,因为上面的解决方案对我不起作用。我得到了 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); 

【讨论】:

是的,SingletonMaps 是不可变的——我只是为了方便使用它 您应该查看代码以使其更紧凑,了解 MessageContext.HTTP_REQUEST_HEADERS == "javax.xml.ws.http.request.headers" 他的版本实际上短了一个字符,甚至包括引号,但我知道你的意思。使用常量当然更安全。 :)

以上是关于JAX-WS 客户端:跨多个服务维护会话/cookie的主要内容,如果未能解决你的问题,请参考以下文章

Django中的会话技术(Cookie,Session,Token)

PHP系列(十三)PHP会话控制

如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID

Web开发中,用到的4种会话跟踪技术

JAX-WS:有状态 WS 在独立进程中失败

使用 Express 和 Node,如何跨子域/主机头维护会话