我们使用SUN Jersey客户端在同一个java项目中使用一些REST服务和Apache CXF来提供一些REST服务。我们使用的一些服务返回带有“Expires”指令集的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,value是日期)。
经过一番挖掘,我们发现这是由于CXF解析了Set-Cookie HTTP头的方式。请参阅fromString方法here。基本上,代码认为它在Set-Cookie标头中找到的最后一个<name>=<value>
对是cookie。在这种情况下,expires=<date>
发生在name=value
之后(后者是需要的实际Cookie)。
OTOH,Jersey的头部解析代码here(实际的impl类是here,它调用前者)返回实际的cookie,忽略expires指令。这种行为对我们来说已经足够了。所以我们想选择泽西岛的版本。我们如何做到这一点?请注意,我们还需要项目仍然使用CXF(提供服务),因此无法删除依赖项。
有问题的项目是Maven项目。