升级到Apache HttpClient 4.4后,它不会发送带有请求的cookie

时间:2015-07-14 16:42:43

标签: java cookies apache-httpclient-4.x

我正在使用Apache HttpClient向我们的内部API服务器发送请求。服务器需要身份验证,并且需要使用身份验证令牌设置cookie。

直到HttpClient 4.3.6这已经正常工作,但在4.4及以上版本已经停止发送请求的cookie。我的cookie域设置为.subdomain.mycompany.com,适用于4.3.6,但不适用于4.4及更高版本。如果我更具体,并将完整主机作为cookie域,即host.subdomain.mycompany.com,它可以工作,但这不是解决方案。

这是一个类似于我正在做的代码片段:

public CloseableHttpResponse execute(CloseableHttpClient httpClient) throws IOException {
    BasicClientCookie cookie = new BasicClientCookie("cookieName", "myAuthtoken");
    cookie.setPath("/");
    cookie.setDomain(".subdomain.mycompany.com");
    cookie.setSecure(false);
    HttpContext localContext = new BasicHttpContext(parentContext);
    CookieStore cookieStore = new BasicCookieStore();
    cookieStore.addCookie(cookie);
    localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);
    return httpClient.execute(target, request, localContext);
}

httpClient已经构建并传递到此代码中,该代码设置了auth cookie。

我看到了这个,类似Cookies getting ignored in Apache httpclient 4.4,但在我的情况下,cookie没有被发送到服务器。

在打开HttpClient中的线路记录后,我可以在4.3.6中看到以下内容,但不会在4.4及以上版本中看到:

DEBUG [org.apache.http.client.protocol.RequestAddCookies] Cookie [version: 0][name: cookieName][value: authToken][domain: .subdomain.mycompany.com][path: /][expiry: Wed Jul 15 16:07:05 IST 2015] match [host.subdomain.mycompany.com:80/myApi]

这让我觉得它与cookie域匹配有关。有人有主意吗?感谢。

1 个答案:

答案 0 :(得分:0)

如另一个答案所建议的那样,设置如下内容应该可以解决:

cookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".subdomain.mycompany.com");

HTTP Components Chapter 3. HTTP state management中记录了设置ClientCookie.DOMAIN_ATTR的必要性:

以下是创建客户端cookie对象的示例:

BasicClientCookie cookie = new BasicClientCookie("name", "value");
// Set effective domain and path attributes
cookie.setDomain(".mycompany.com");
cookie.setPath("/");
// Set attributes exactly as sent by the server
cookie.setAttribute(ClientCookie.PATH_ATTR, "/");
cookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".mycompany.com");