【问题标题】:After upgrading to Apache HttpClient 4.4 it does not send cookies with requests升级到 Apache HttpClient 4.4 后,它不会发送带有请求的 cookie
【发布时间】:2015-10-03 10:36:26
【问题描述】:

我正在使用 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 它可以工作,但这不是解决方案。

这是一个类似于我正在做的代码sn-p:

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 已经构建并传递到设置身份验证 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 域匹配有关。谁有想法?谢谢。

【问题讨论】:

  • 这似乎是一个严重的错误。如果您尝试不带前导“.”的cookie.setDomain("subdomain.mycompany.com"); 会怎样

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


【解决方案1】:

正如另一个答案所建议的,设置这样的东西应该可以解决:

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

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

以下是创建客户端 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");

【讨论】:

    【解决方案2】:

    我已经调试了示例代码。问题出在BasicDomainHandler.match(Cookie, CookieOrigin) line: 129,因为它期望设置 org.apache.http.cookie.ClientCookie.DOMAIN_ATTR 以匹配从 URL 到 cookie 域的完整主机名。因此,您需要在设置域后将以下行添加到您的代码中:

    cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");
    

    于 2014 年 12 月 19 日晚上 10:59 添加了修订版 1646864:

    符合 RFC 6265 的 cookie 规范

    【讨论】:

    • 非常感谢。实际上,我自己也找到了相同的答案。我也将 ClientCookie.DOMAIN_ATTR 设置为我的域,这似乎有效。但是从你所说的来看,它只需要设置为任何值吗?我觉得现在需要在两个地方设置域有点奇怪。
    • 它只是检查ClientCookie.DOMAIN_ATTR 是否存在:if (((ClientCookie) cookie).containsAttribute(ClientCookie.DOMAIN_ATTR))。该属性设置setDomain() 设置的值不是完整的主机名,而是域,尽管这可以从前导 . (点)我猜。
    猜你喜欢
    • 2011-04-12
    • 2020-04-12
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多