【问题标题】:Cookies getting ignored in Apache httpclient 4.4Cookie 在 Apache httpclient 4.4 中被忽略
【发布时间】:2015-07-15 21:04:47
【问题描述】:

我将 Apache http 客户端从 4.3.6 升级到 4.4,并观察到 ​​cookie 被忽略。知道如何让 cookie 在 4.4 中工作吗?

编辑:代码 sn-p

CookieStore cookieStore = new BasicCookieStore();
cookieStore.addCookie(new BasicClientCookie("name", "value"));
RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.DEFAULT).build();
HttpClient client = HttpClientBuilder.create()
    .disableRedirectHandling()
    .setDefaultRequestConfig(config)
    .setDefaultCookieStore(cookieStore)
    .build();

我尝试了CookieSpecs.DEFAULTCookieSpecs.STANDARDCookieSpecs.STANDARD_STRICT,但似乎都没有用。

【问题讨论】:

  • 您没有显示任何代码。您尝试过Chapter 3. HTTP state management 建议的所有方法吗?
  • 我们愿意帮助回答您的问题,但是我们可能需要更多信息才能这样做,请提供一些您遇到问题的代码示例。你在做什么来做饼干?您在哪个浏览器上发现了这个问题?
  • 添加了 sn-p。在 4.3 中,我也不需要指定 CookieSpec,它就可以了。
  • 你确定它曾经适用于任何版本吗?有问题的 cookie 没有域属性,因此它不应该与任何 cookie 来源匹配
  • 可以为不同的路径(目录)、“/”或“/admin”等设置 Cookie,但您不使用 .setPath("/") - 也许是这样?

标签: java apache-httpclient-4.x


【解决方案1】:

我已经使用 4.3.6 和 4.5 版本执行了示例代码。在 4.3.6 中,我使用了 RequestConfig.DEFAULT,它运行良好。使用 4.5 它返回

java.lang.NullPointerException: while trying to invoke the method java.lang.String.equalsIgnoreCase(java.lang.String) of a null object loaded from local variable 'domain'
at org.apache.http.impl.cookie.PublicSuffixDomainFilter.match(PublicSuffixDomainFilter.java:76)
at org.apache.http.impl.cookie.CookieSpecBase.match(CookieSpecBase.java:135)
at org.apache.http.impl.cookie.DefaultCookieSpec.match(DefaultCookieSpec.java:177)
at org.apache.http.client.protocol.RequestAddCookies.process(RequestAddCookies.java:165)

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

符合 RFC 6265 的 cookie 规范

为了使 4.5 版能够正常工作,您需要将域设置为 cookie,并且域不等于确切的主机也 org.apache.http.cookie.ClientCookie.DOMAIN_ATTR必须设置:

    BasicClientCookie cookie = new BasicClientCookie("cookieName", "cookieValue");
    cookie.setDomain(".my.domain.com");
    cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");
    CookieStore cookieStore = new BasicCookieStore();
    cookieStore.addCookie(cookie);

【讨论】:

  • 尝试将 CookieSpec 设置为标准:{CookieStore cookieStore = new BasicCookieStore(); RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build(); CloseableHttpClient 客户端 = HttpClientBuilder.create().setDefaultRequestConfig(globalConfig).setDefaultCookieStore(cookieStore).build();}
  • 万岁!我刚刚以您的回答结束了为期 2 周的搜索。
【解决方案2】:

您的示例应用程序中的 cookie 通过默认策略和标准策略与 cookie 来源相匹配。我怀疑这是一个 HttpClient 问题。

BasicClientCookie cookie = new BasicClientCookie("name", "value");
cookie.setDomain("0.0.0.0");

CookieOrigin cookieOrigin = new CookieOrigin("0.0.0.0", 8000, "/", false);

DefaultCookieSpec defaultCookieSpec = new DefaultCookieSpec();
System.out.println("Default policy match :" + defaultCookieSpec.match(cookie, cookieOrigin));

RFC6265LaxSpec standardCookieSpec = new RFC6265LaxSpec();
System.out.println("Standard (RFC 6265) policy match :" + standardCookieSpec.match(cookie, cookieOrigin));

使用wire logging 准确查看HttpClient 生成了什么样的cookie 标头

【讨论】:

  • 我编写的示例服务器能够读取 cookie,但实际上我正在调用第三方服务,该服务在请求中需要一个 cookie。当我尝试使用当前版本的 httpclient 访问它时,它停止了工作。
  • 因此,cookie 不会被忽略,但某些第三方服务器无法处理它,这是完全不同的故事
  • 是的,我只是在发布问题并使用我的简单服务器后才发现。
猜你喜欢
  • 2013-11-21
  • 2016-05-03
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2019-03-31
相关资源
最近更新 更多