如何在Java中使用HttpURLConnection获取Cookies?

10

当我使用 HttpURLConnection 并尝试调用 con.getHeaderField("Set-Cookie") 时,我得到了这个响应:

__cfduid=1111111aaaaaa; expires=Wed, 19-Dec-18 06:19:46 GMT; path=/; domain=.site.com; HttpOnly

但是浏览器Cookie是:

__cfduid=1111111aaaaaa; _ym_uid=000000000; PHPSESSID=zzzzzzzz; _ym_isad=1; key=555

我该如何使用HttpURLConnection获取完整的cookie?对我而言,最重要的cookie是key

请注意,如果在连接上调用con.getHeaderField(name),而该连接多次设置相同的标题并可能具有不同的值(这可能是“set-cookie”的情况),则仅返回最后一个值。因此最好遍历所有标题字段并测试每个字段是否为名称“Set-Cookie”。 - Ralph
1个回答

6

Set-cookie头的值可以修改或追加浏览器中的Cookie。浏览器会从Cookies中删除过期的Cookie,这项工作由浏览器完成。

在Java中请求Web时,程序员需要通过单个或多个响应中的Set-cookie头组装“完整”的Cookie。

如果您使用HttpURLConnection,可以使用CookieManager

以下是一个示例:

CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);

URL url = new URL("https://stackoverflow.com");

URLConnection connection = url.openConnection();
connection.getContent();

List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
for (HttpCookie cookie : cookies) {
    System.out.println(cookie.getDomain());
    System.out.println(cookie);
}

当您发送HTTP请求时,CookieManager会自动填充Cookie头。而且,可以直接从域中通过CookieManger获取该值。

1
如何实现呢?能给个小例子吗?我们有一个HeaderField("Set-Cookie"),我需要完整的cookies。 - Shannon
@Shannon 这里的答案展示了如何设置cookies:https://dev59.com/questions/tWTWa4cB1Zd3GeqPC2fx - Josh
对我来说没有用,但使用Apache HttpClient库确实有效:https://dev59.com/dWoy5IYBdhLWcg3wKq4S#28973623 - Andreas Covidiot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接