使用HttpURLConnection的Cookie会话

时间:2018-02-02 23:43:21

标签: java cookies session-cookies httpurlconnection

我正在开发一个登录网站的应用程序。我有问题,因为当我阅读浏览器的请求标题时,浏览器会发送一个cookie。我需要知道如何在我的应用程序中执行此操作,我的意思是,当我开始连接时,它自己定义请求的cookie。我试图使用这个df.pivot_table( \ index=['b', 'c'], columns='a', aggfunc='mean', dropna=False \ ).reindex(tups) # w # a a1 a2 a3 a4 a5 a6 a7 a8 a9 # NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN # b1 c1 NaN NaN NaN NaN 100.0 NaN NaN NaN NaN # c2 NaN NaN NaN NaN NaN NaN 250.615174 NaN NaN # b2 c3 NaN NaN NaN NaN NaN NaN NaN NaN NaN # c4 NaN NaN NaN NaN NaN NaN NaN NaN NaN # b3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN # NaN c4 NaN NaN NaN NaN NaN NaN NaN NaN NaN # c5 NaN NaN NaN NaN NaN NaN NaN NaN NaN 但是没有用。

来源:

CookieHandler.setDefault( new CookieManager( null, CookiePolicy.ACCEPT_ALL ) );

申请我的申请表:

CookieHandler.setDefault( new CookieManager( null, CookiePolicy.ACCEPT_ALL ) );
URL url2 = new URL("https://m.example.com.br/login.jhtml");
        HttpURLConnection conn = (HttpURLConnection) url2.openConnection();
        conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
        conn.setRequestMethod("POST");
        conn.setRequestProperty("User-Agent","User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0");
        conn.setRequestProperty("Content-Length", parameters + Integer.toString(parameters.getBytes().length));
        conn.setFollowRedirects(true);
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
        wr.writeBytes(parameters);
        wr.flush();
        wr.close();
        if (conn.getResponseCode()== 200){
            InputStream in =  conn.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(in));
            String line=null;
            StringBuffer response = new StringBuffer();
            while((line = rd.readLine()) != null) {
                response.append(line);
                response.append('\r');
            }
            rd.close();
            System.out.println(response.toString());
        }

请求浏览器标题:

Content-Type: application/x-www-form-urlencoded
User-Agent: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0
Connection: Keep-Alive
Accept-Encoding: gzip
Cookie: TS0163e05c="01ed0a5ec20a04efb37decf4185e55cfe68e06164c32f1a95d1d5b8f12c72abbee029ed64985c09681a55832e444c61821a1eb6fb22d6ed9880314fa0c342074316e309642";$Path="/";$Domain="example.com"; ps-website-switching-v2=%7B%22ps-website-switching%22%3A%22ps-website%22%7D; TS015a85bd=01ed0a5ec25aecf271e4e08c02f852e9ea6199a117a0a8e0339b3e98fd1d51518e5f09ead481039d4891f66e9cc48a13ced14792de
Content-Length: 198

注意Cookies,为什么它们如此不同?如果没有使用Host: m.example.com Connection: keep-alive Content-Length: 197 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Linux; Android 5.0.2; LG-D337 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9 Cookie: _ga=GA1.3.313511484.1517525889; _gid=GA1.3.507266479.1517525889; DEretargeting=563; CSASF=; JS_SESS=; BT=%3B106%3B; DN.... 进行设置,我该怎样发送这样的Cookie?

1 个答案:

答案 0 :(得分:0)

由于以下原因,

HttpURLConnection不是一种非常可靠的网站抓取方式或互动方式:

  • HttpURLConnection不了解JavaScript。 JavaScript可以设置cookie以及提供网站功能的主要部分。
  • HttpURLConnection不会下载与页面关联的所有资源,例如帧中的其他.html文件,图像(0 px图像有时也可以添加Cookie,但如果你从未获得它们,你将永远不会获得cookie), JavaScript,依此类推。
  • CookieHandler仅适用于在HTTP响应标头中直接传递给您的 的Cookie。如果网站的内容中的任何内容(包括图像等嵌入内容)会导致更多的Cookie被创建,那么您无法使用CookieHandler,因为它不了解HTML / JS /等

您应该使用Selenium代替。 Selenium自动化真正的 Web浏览器(或者至少更接近真实Web浏览器的东西),它可以解析HTML并根据Web标准的期望行事。

至于使用哪个浏览器驱动程序(后端),这里有几个选项:

  • HtmlUnit,这可能是最快的驱动程序(至少它具有最少的内存开销),但缺点是不支持所有最新的Web标准和技术。如果它适用于您的站点,它可能是最佳选择,因为它不需要任何本机驱动程序组件。它确实支持一大堆JavaScript(请参阅链接),但与最新的Firefox或Chrome相比,可能没有更新的功能支持。 HtmlUnit是无头的。
  • PhantomJS,它基于相当过时的WebKit版本。您的网络标准支持将持续到2013年左右,这对于大多数网站来说可能都很好,但是一些前沿功能将不起作用。它还有一些包含某些类型内容的错误。然而,它也是无头的,拥有相当大的用户群,并且通常比完整的浏览器更低的开销。
  • Firefox,Chrome,Edge,Opera或IE。 Firefox和Chrome现在可以选择无头支持。

“无头”和“无头”之间的区别(或“无头”,如果您愿意)是无头浏览器不会创建任何GUI窗口。如果您在无头Linux机器上运行,除非您想要创建Xvfb虚拟X服务器或其他东西,否则这几乎是必需的。如果您是从具有图形界面的计算机(Windows,MacOS或桌面Linux)运行它,如果您希望在运行代码时弹出浏览器,则由您决定。

无头浏览器往往相对更快,并且您可以并行扩展它们的更多实例,因为它们在您使用它们时不占用系统上的任何图形资源。他们只是使用浏览器引擎本身来处理Web内容,并允许您通过Selenium访问/驱动它。

如果您确实想要无头,但您需要最新的网络平台功能和标准支持,请查看使用Headless Chrome或Headless Firefox。

无头Chrome简介:https://developers.google.com/web/updates/2017/04/headless-chrome

Headless Firefox简介:https://developer.mozilla.org/en-US/Firefox/Headless_mode