【问题标题】:Java - How to get and add cookies to request header correctly?Java - 如何正确获取和添加 cookie 以请求标头?
【发布时间】:2019-11-28 16:48:25
【问题描述】:

我需要访问网站上的许多不同页面并收集信息。我不确定如何处理 cookie。如果我使用 chrome 调试器控制台 (F12) 查看网络活动,我可以看到正在发送的请求属性和 cookie。如果我专门为其中一个页面添加了 cookie(参见注释掉的 con.setRequestProperty("Cookie", ...),则信息检索成功。

            URL url = new URL(urlStr);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.setRequestProperty("Host", county +"." +referer +".com");
            con.setRequestProperty("Connection", "keep-alive");
            con.setRequestProperty("Accept", "application/json, text/javascript, */*; q=0.01");
            con.setRequestProperty("X-Requested-With", "XMLHttpRequest");
            con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36");
            con.setRequestProperty("Origin", "http://evil.com/");
            con.setRequestProperty("Referer", "https://" +county +"." +referer +".com/index.cfm?zaction=AUCTION&Zmethod=PREVIEW&AUCTIONDATE=" +df.format(date));
            con.setRequestProperty("Accept-Language", "en-US,en;q=0.9");
            //con.setRequestProperty("Cookie", "cfid=9ed9c083-4696-4712-950d-1c0ad0727883; cftoken=0; AWSELB=CF13C5A70AE16731FBD093515EF0DDB58935BEB4D69838721C70C3BED039F919AF343D891D9A2001BD1070AC4C076AA72DF0A7EA6AEED1091BCD24CC7203622E75C0DE5C92; _gcl_au=1.1.1696117075.1563489288; __utmc=119398810; __utmz=119398810.1563489288.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); CF_CLIENT_" +county.toUpperCase() +"_" +referer.toUpperCase() +"_TC=1563505029291; __utma=119398810.1711105058.1563489288.1563498837.1563505090.3; __utmt_UA-51657054-1=1; __utmb=119398810.10.10.1563505090; testcookiesenabled=disabled; CF_CLIENT_" +county.toUpperCase() +"_" +referer.toUpperCase() +"_LV=1563508162268; CF_CLIENT_" +county.toUpperCase() +"_" +referer.toUpperCase() +"_HC=221");

            //handle cookies
            String cookiesHeader = con.getHeaderField("Set-Cookie");
            List<HttpCookie> cookies = HttpCookie.parse(cookiesHeader);
            CookieManager cookieManager = new CookieManager();
            cookies.forEach(cookie -> cookieManager.getCookieStore().add(null, cookie));
            con.disconnect();
            con = (HttpURLConnection) url.openConnection();     //create new connection with cookies
            con.setRequestProperty("Cookie", StringUtils.join(cookieManager.getCookieStore().getCookies(), ";"));

            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            StringBuilder stringBuilder = new StringBuilder();
            while ((str = in.readLine()) != null) {
                stringBuilder.append(str);
            }
            in.close();
            con.disconnect();

但是如果使用“处理cookies”部分中的代码(来自教程https://www.baeldung.com/java-http-request),则会返回一个空数据集。有人能发现我做错了什么吗?

【问题讨论】:

  • 您想从响应中读取 cookie 还是将 cookie 作为请求的一部分发送?
  • 我想将它们作为请求的一部分发送。但是如何首先获得它们? //handle cookies 部分应该获取它们,断开连接,然后重新连接到位的 cookie,但它似乎不起作用,因为输出是 {"retHTML":"", "rlist":""},一个空集。

标签: java cookies request httpurlconnection


【解决方案1】:

String cookiesHeader = con.getHeaderField("Set-Cookie"); 用于从响应中读取 cookie。但在您的实例中,它没有读取任何内容,因为尚未执行 http 请求。

因此,首先您需要执行请求,然后您才能使用String cookiesHeader = con.getHeaderField("Set-Cookie"); 从响应中读取 cookie。所以只需在String cookiesHeader = con.getHeaderField("Set-Cookie"); 之前添加一个con.connect(),它将执行请求,然后帮助从响应中读取cookie。然后,其余代码会将收到的 cookie 添加回请求中。

con.connect();
String cookiesHeader = con.getHeaderField("Set-Cookie");

您也可以先检查请求是否执行成功,然后才读取cookies,然后执行以下流程:

int statusCode = con.getResponseCode();
if (statusCode == 200) {
   String cookiesHeader = con.getHeaderField("Set-Cookie");
   //rest of the code
}

【讨论】:

  • 嗯。我以为它已经通过 url.openConnection() 连接了?正如您所建议的,我在 String cookiesHeader = 之前添加了 con.connect,但这没有任何区别。仍然得到一个空集。
  • @user3217883 能否调试并检查 cookie 是否被正常读取以及是否将正确的 cookie 添加到连接请求中?
  • @user3217883 不,它没有通过 url.openConnection 连接。您需要使用 con.connect、con.getResponseCode、con.getInputStream 或 con.getOutputStream 来执行请求。
  • 我也尝试在 con.setRequestProperty("Cookie",... 之后添加另一个 con.connect(),但没有效果。还在第一个 con.connect() 之后打印了 statusCode。总是显示200. 我会按照你的建议进一步调试。
  • 我正在查看 cookie 的内容并且只看到一个,AWSELB= cookie。显然它没有拿起其他的。不知道为什么。
【解决方案2】:

看来我可能找错了树。 url 的参数显然会随着时间而变化。你可以在下面看到。

https://brevard.realforeclose.com/index.cfm?zaction=AUCTION&Zmethod=UPDATE&FNC=LOAD&AREA=W&PageDir=0&doR=1&tx=1563563124890&bypassPage=1&test=1&_=1563563124891

https://brevard.realforeclose.com/index.cfm?zaction=AUCTION&Zmethod=UPDATE&FNC=LOAD&AREA=W&PageDir=0&doR=1&tx=1563508160468&bypassPage=1&test=1&_=1563508160468

我不知道这些数字是什么意思,也不知道如何在正确的时间提供正确的数字。昨天创建的第一个现在返回一个空集,刚刚创建的第二个返回了良好的数据。

编辑: 嗯,我明白了这些数字的含义。有一个单独的查询来获取纽约的毫秒时间,加上一个偏移量。我已经实现了该查询,现在它创建了一个有效的 url,如果我将它单独粘贴到一个新的浏览器窗口中,它总是返回好的数据。但它仍然没有显示我的 java 代码中的数据。

这是我在 Chrome 调试器 (F12) 网络选项卡中看到的请求标头和其他数据,当我从他们的链接以官方方式访问数据时:

一般

Request URL: https://brevard.realforeclose.com/index.cfm?zaction=AUCTION&Zmethod=UPDATE&FNC=LOAD&AREA=W&PageDir=0&doR=1&tx=1563630471816&bypassPage=1&test=1&_=1563630471816
Request Method: GET
Status Code: 200 OK
Remote Address: 34.236.53.129:443
Referrer Policy: no-referrer-when-downgrade

响应标头

Access-Control-Allow-Headers: content-type Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin: * Allow: POST, GET, OPTIONS, PUT, DELETE
Connection: keep-alive Content-Encoding: gzip Content-Length: 1179
Content-Type: text/html;charset=UTF-8 Date: Sat, 20 Jul 2019 13:47:52 GMT
Server: Realforeclose/1a Vary: Accept-Encoding

请求标头

Provisional headers are shown
Accept: application/json, text/javascript, */*; q=0.01
Referer: https://brevard.realforeclose.com/index.cfm?zaction=AUCTION&Zmethod=PREVIEW&AUCTIONDATE=07/25/2019
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
X-Requested-With: XMLHttpRequest

查询字符串参数

zaction=AUCTION&Zmethod=UPDATE&FNC=LOAD&AREA=W&PageDir=0&doR=1&tx=1563630471816&bypassPage=1&test=1&_=1563630471816

【讨论】:

  • 好吧,我明白了这些数字的含义。有一个单独的查询来获取纽约的毫秒时间,加上一个偏移量。我已经实现了该查询,现在它创建了一个有效的 url,如果我将它单独粘贴到一个新的浏览器窗口中,它总是返回好的数据。但它仍然没有显示我的 java 代码中的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多