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

2022-09-03 01:53:27

我想使用cookie进行手动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时,如上所述,我以访客身份获取页面,这表明我不在线,安全令牌的值是访客,这对我没有用。我会检查你给我的链接,希望能找到一个解决方案。


答案 1

可以肯定的是,您应该从响应的标头中收集 Cookie。要在后续请求中将它们发送回去,您应该使用URLConnection#addRequestProperty()逐个设置它们。Set-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属性,如,等。split(";", 2)expirespath

对于一个更方便的HTTP客户端,我建议看看Apache HttpComponents客户端。它可以更透明地处理所有饼干的东西。

另请参阅:


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

将来,您应该更加清楚地了解检索到的确切错误,而不是在野外猜测某些东西。复制粘贴确切的错误消息等。


答案 2

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

CookieHandler.setDefault(new CookieManager());

然后,您将自动保存它收到的任何cookie,并将它们与下一个请求一起发回同一主机。HttpURLConnection


推荐