1

我编写了一个 Java 小程序,它从单个主机的多个页面中获取 HTML 内容并从中提取数据。我使用 Jsoup,它运行良好,但它会自动为浏览器中设置的主机使用 cookie,并在后续请求中发送新设置的 cookie。(我相信这是由 Java 本地完成的)

我希望它在运行小程序时忽略服务器设置的所有 cookie,并忽略浏览器可能已经拥有的任何 cookie。

我的代码非常简单。

String url = "http://example.com/my/web-page.html";
Document document = Jsoup.connect(url).userAgent("<hard-coded static value>").get();
// Extract data from document with org.Jsoup.nodes.Document.select(), etc.

这会重复使用多个 URL,所有 URL 都具有相同的主机 (example.com)。

总之,我基本上希望它:

  1. 忽略可能在浏览器中设置的 example.com 的任何 cookie。
  2. 如果小程序发出请求时服务器设置了任何新的 cookie,则在后续请求中忽略它。如果可能,还要阻止 cookie 存储在浏览器中。

我已经搜索了很多,但无法找到解决方案。我真的很感激任何帮助。我不介意使用 Apache HTTPClient 或任何其他第三方库,但我不想这样做,这样我可以保持小程序的文件大小很小。

提前致谢:)

4

2 回答 2

0

而不是使用ConnectionJsoup.connect("url");方法的结果返回),使用Response

Map<String, String> cookies = new HashMah<String, String>();

Response res = Jsoup
    .connect("url")
    .cookies(cookies)
    .userAgent("userAgent")
    .method(Method.GET) //Or whatever method needed be
    .execute();

我知道这是一条巨大的线路,但这会很好。

于 2012-06-08T14:35:32.563 回答
-1

您应该org.jsoup.Connection.Request为此进行操作:

    String url = "http://example.com/my/web-page.html";
    Connection con = Jsoup.connect(url).userAgent("<hard-coded static value>");
    ...
    con.get();
    ...
    Request request = con.request();
    Map<String, String> cookies = request.cookies();
    for(String cookieName : cookies.keySet()) {
        //filter cookies you want to stay in map
        request.removeCookie(cookieName);
    }

您还应该禁用followRedirects并手动进行重定向(删除 cookie)。您必须实现自己的“Cookie/域移除器”。

JSoup在内部使用java.net.HttpURLConnection,并且您无法以某种方式拦截实际调用execute方法的核心功能,org.jsoup.helper.HttpConnection.Response.execute(...)因为它是静态的并且具有包保护访问。您也req不能resHttpConnection. 此外,您无法实现自己的(或由于构造函数而org.jsoup.Connection扩展其实现)添加强制 JSoup 来使用它。HttpConnectionprivate

考虑到以上所有我的建议 - 使用 HttpClient / HtmlUnit - 因为你最终会在受限环境中“重新发明轮子”。

于 2012-06-08T13:33:02.887 回答