0

我们在同一个 java 项目中使用 SUN Jersey 客户端使用一些 REST 服务和使用 Apache CXF 来提供一些 REST 服务。我们使用的一些服务返回带有“过期”指令集的 cookie。例如Set-Cookie: name=value; Expires=Wed, 09 Jun 2021 10:18:14 GMT

考虑下面的代码,假设 wr 是 Jersey WebResource。ClientResponse 也是一个 Jersey 类。

ClientResponse resp = wr.get(ClientResponse.class);
System.out.println(resp.getCookies())

现在,对于带有 expires 指令的 cookie,不会返回实际的 cookie。相反,expires 指令本身作为 cookie 返回(cookie 的名称是 Expires,值是日期)。

经过一番挖掘,我们发现这是由于 CXF 解析 Set-Cookie HTTP 头的方式造成的。请参考此处的 fromString 方法。基本上,代码认为<name>=<value>它在 Set-Cookie 标头中找到的最后一对是 cookie。在这种情况下,expires=<date>发生在之后name=value(后者是所需的实际 cookie)。

OTOH,Jersey 的标头解析代码在这里(实际的 impl 类在这里,它调用前者)返回实际的 cookie,忽略 expires 指令。这种行为对我们来说已经足够好了。所以我们想选择泽西的版本。我们如何做到这一点?请注意,我们还需要项目仍然使用 CXF(服务服务),因此无法删除依赖项。

有问题的项目是一个 Maven 项目。

4

0 回答 0