如何使用Java在Http Get方法中设置Cookies

时间:2010-07-14 18:16:17

标签: java http cookies get forum

我想用cookies进行手动GET以下载和解析网页。我需要提取安全令牌,以便在论坛上发帖。我已完成登录,已阅读响应并提取了cookie(3对(名称,值))。然后我写了包含这样的cookie的字符串:

CookieString="name1=value1; name2=value2; name3=value3"

然后我做以下

HttpURLConnection connection
connection = (HttpURLConnection)(new URL(Link).openConnection());
connection.setRequestMethod("GET");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Cookie", CookieString );
connection.connect();

然后我阅读了该页面,但它显示我没有登录论坛。我做错了什么?

编辑:我知道如果我想发帖,我必须提取安全令牌。我的思路是,为了提取它,我需要获取这个特定的页面。但是为了将安全令牌作为隐藏字段,我必须在线,因此我需要cookie。但是,当我获取页面并设置上面提到的cookie时,我将该页面作为访客,它表明我不在线,安全令牌的值是guest,这对我没用。我会检查你给我的链接,希望能找到解决方案。

3 个答案:

答案 0 :(得分:14)

可以肯定的是,您应该从响应的Set-Cookie标题中收集Cookie。要在后续请求中将其发回,您应该使用URLConnection#addRequestProperty()逐个设置它们。

基本上:

// ...

// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");

// ...

// Send them back in subsequent requests:
for (String cookie : cookies) {
    connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
}

// ...

split(";", 2)可以删除与expirespath等服务器端无关的Cookie属性。

对于更方便的HTTP客户端,我建议您查看Apache HttpComponents Client。它可以更透明地处理所有cookie内容。

另见:


更新:根据评论,这不是Cookie问题。错误的请求令牌意味着服务器内置了CSRF / bot预防(以防止像您这样的人)。您需要使用表单从请求的页面中提取令牌作为隐藏的输入字段,并将其重新发送为请求参数。 Jsoup可能对提取所有(隐藏)输入字段很有用。不要忘记传递按钮的名称 - 值对,您要以编程方式“按”。另请参阅上述链接以获取更多提示。

将来,您应该更清楚地了解您检索的确切错误,而不是在野外猜测。 Copypaste确切的错误消息等。

答案 1 :(得分:6)

假设cookie值不是硬编码的,而是从先前的请求获得的,那么使用CookieHandler类可能最容易。

CookieHandler.setDefault(new CookieManager());

然后您的HttpURLConnection会自动保存收到的所有Cookie,并将下一个请求发回给同一主机。

答案 2 :(得分:-1)

// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");

// ...

// Send them back in subsequent requests:
for (String cookie : cookies) {
    connection.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
}

上面的代码适用于发送多个cookie,只需使用setRequestProperty而不是addRequestProperty。工作代码是:

// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");

// ...

// Send them back in subsequent requests:
for (String cookie : cookies) {
    connection.setRequestProperty("Cookie", cookie.split(";", 1)[0]);
}