如何使用Java在Http Get方法上设置cookie

如何使用Java在Http Get方法上设置cookie,java,http,cookies,get,forum,Java,Http,Cookies,Get,Forum,我想用cookies做一个手动获取,以便下载和解析网页。我需要提取安全令牌,以便在论坛上发表帖子。我已完成登录,已阅读响应并提取cookies(3对(名称、值))。然后,我编写了包含cookies的字符串,如下所示: CookieString="name1=value1; name2=value2; name3=value3" 然后我做下面的事情 HttpURLConnection connection connection = (HttpURLConnection)(new URL(Link

我想用cookies做一个手动获取,以便下载和解析网页。我需要提取安全令牌,以便在论坛上发表帖子。我已完成登录,已阅读响应并提取cookies(3对(名称、值))。然后,我编写了包含cookies的字符串,如下所示:

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();
然后我读了这个页面,但它显示我没有登录论坛。我做错了什么


编辑:我知道如果我想发表文章,我必须提取安全令牌。我的思路是,为了提取它,我需要得到这个特定的页面。但要将安全令牌作为隐藏字段,我必须在线,因此我需要cookies。但是,当我获取页面并按照上面提到的方式设置cookies时,我以来宾身份获取页面,这表明我不在线,并且安全令牌的值为来宾,这对我没有用处。我将检查您给我的链接,希望能找到解决方案。

当然,您应该从响应的
设置Cookie
标题中收集Cookie。要在后续请求中发回,应使用逐个设置

基本上:

// ...

// 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]);
}

// ...
/。。。
//抓取集Cookie头:
List cookies=connection.getHeaderFields().get(“设置Cookie”);
// ...
//在后续请求中将其发送回:
用于(字符串cookie:cookies){
connection.addRequestProperty(“Cookie”,Cookie.split(“;”,2)[0]);
}
// ...
split(“;”,2)
用于去除与服务器端无关的cookie属性,如
expires
path

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

另见:

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


在将来,你应该更清楚你检索到的确切错误,而不是在野外猜测。复制粘贴准确的错误消息,依此类推。

假设cookie值不是硬编码的,而是从以前的请求中获得的,那么使用
类可能是最简单的

CookieHandler.setDefault(new CookieManager());
然后,您的
HttpURLConnection
将自动保存它接收到的任何Cookie,并在下次请求时将它们发送回同一主机。

//抓取集Cookie头:
// 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]);
}
List cookies=connection.getHeaderFields().get(“设置Cookie”); // ... //在后续请求中将其发送回: 用于(字符串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]);
}
//抓取集Cookie头:
List cookies=connection.getHeaderFields().get(“设置Cookie”);
// ...
//在后续请求中将其发送回:
用于(字符串cookie:cookies){
connection.setRequestProperty(“Cookie”,Cookie.split(“;”,1)[0]);
}

我就是这么做的,但它不起作用。我从响应的集合Cookie头读取Cookie。我曾经将它们与setRequestProperty一起设置。我一个接一个地尝试addRequestProperty,但结果是一样的。我找不到我做错了什么。如果可能的话,我宁愿避免使用第三方库。那么问题就出在其他地方了。什么是URL?像Fiddler这样的HTTP跟踪工具会说什么?URL是vbulletin论坛的回复页面。奇怪的是,当我使用与POST方法相同的链接上的Cookie发布回复时,响应是一个页面,上面说我没有有效的安全令牌,但它看到我在线,因此Cookie工作。当我试图使用相同的cookies获取相同的页面以提取安全令牌时,它会要求我登录。我会安装fiddler,看看它是如何工作的,然后再给你回复。如果你有什么想法,请告诉我。FWIW,对于使用Android的人,我最近尝试将多个cookie附加到
UrlConnection
上,发现
addRequestProperty()
实际上并没有添加相同名称的多个头。这种观察可能是错误的,但我能让服务器识别我的多个cookie的唯一方法是将它们连接到一个
字符串中,用
分隔它们。然后使用
addRequestProperty()
/
setRequestProperty()
将单个
字符串设置为“Cookie”标头,如上所示。我似乎发现了关于
addRequest…
setRequest…
实际做什么的相互矛盾的信息。我尝试了一下,我相信
cookie.split(;”,1)[0]
应该是
cookie.split(;”,2)[0]
(limit参数表示要返回的片段数,其中最后一个片段自动占用字符串的剩余部分)。