如何使用 Apache HttpClient 4.3 处理 Cookie

Posted

技术标签:

【中文标题】如何使用 Apache HttpClient 4.3 处理 Cookie【英文标题】:How to handle Cookies with Apache HttpClient 4.3 【发布时间】:2013-10-08 19:49:21 【问题描述】:

我需要在 Java 中实现一系列 HTTP 请求,并决定在 4.3 版本(最新版本)中使用 Apaches HttpClient。

问题是所有这些请求都使用 cookie 进行会话管理,我似乎无法找到访问该 cookie 并将其从请求传递到请求的方法。我使用 curl 的命令类似于:

# Login
curl -c cookies -d "UserName=username&Password=password" "https://example.com/Login"

# Upload a file
curl -b cookies -F fileUpload=@IMG_0013.JPG "https://example.com/File"

# Get results of server processing file
curl -b cookies "https://example.com/File/1234/Content"

它们完美地工作。但是,使用 HttpClient 似乎不起作用。我尝试的是:

    URI serverAddress = new URI("https://example.com/");

    URI loginUri = UriBuilder.fromUri(serverAddress).segment("Login").queryParam("UserName", "username")
            .queryParam("Password", "password").build();

    RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.BEST_MATCH).build();
    CookieStore cookieStore = new BasicCookieStore();
    HttpClientContext context = HttpClientContext.create();
    context.setCookieStore(cookieStore);

    CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(globalConfig).setDefaultCookieStore(cookieStore).build();
    HttpGet httpGet = new HttpGet(loginUri);
    CloseableHttpResponse loginResponse = httpClient.execute(httpGet,context);

    System.out.println(context.getCookieStore().getCookies());

最后一行的输出总是一个空列表。我认为它应该包含我的 Cookie,对吗?

谁能给我一个关于如何使用 Apache HttpClient 4.3 处理 cookie 的小例子?

谢谢

【问题讨论】:

什么是UriBuilder?在 Apache Commons 中,我看到 URIBuilder(大写 R 和 I)。 这是 6 年前的事了。我不知道我用这个做什么了。如果 URIBuilder 而不是 UriBuilder 适合您,请继续。 大概指的是javax.ws.rs.core.Uribuilder 【参考方案1】:

您的代码对我来说看起来不错(除了不释放资源,但我认为为简洁起见省略了异常处理)。 cookie 存储为空的原因可能是目标服务器违反了实际的 cookie 策略(在您的情况下为 BEST_MATCH)。因此,服务器发送的 cookie 被视为无效而被拒绝。您可以按照here 所述打开上下文/线路日志记录,以了解是否是这种情况(以及其他有用的上下文详细信息)。

【讨论】:

谢谢。那非常有帮助。我想我发现凭据实际上是使用 POST 请求和 POST 参数传输的。

以上是关于如何使用 Apache HttpClient 4.3 处理 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apache HttpClient 4.3 处理 Cookie

如何在 Apache HttpClient 4.1 中处理会话

使用Apache HttpClient 4.x发送Json数据

android 使用Apache httpclient 4.3 出错

忽略 Apache HttpClient 4.3 中的 SSL 证书

Apache HttpClient 4.3 和 x509 客户端证书进行身份验证