【问题标题】:Java : download a web page using a URL from a specific server ipJava:使用来自特定服务器 ip 的 URL 下载网页
【发布时间】:2016-08-08 07:45:12
【问题描述】:

有很多关于如何下载网页的指南,给定它在 java 中的 URL。 在这种情况下,网页是从 DNS 提供的服务器下载的(它返回托管网页的服务器之一的 ip)。

我的问题是 - 给定服务器的特定 IP,我如何使用其 URL 下载托管在特定服务器中的网页?

为了澄清这个问题,请考虑一个由多个服务器托管的网站,例如 google。如果我仅使用“www.google.com”URL 下载网页,我将获得来自其中一台托管服务器(DNS 会选择)的网页。但是,假设我拥有托管 www.google.com 的服务器之一的 IP,并且我希望专门从该服务器下载网页 - 我将无法单独使用该 URL,因为我无法保证我下载了来自正确服务器的网页。

这个问题的完整答案也应该支持 HTTPS 协议。

【问题讨论】:

    标签: java url network-programming ip


    【解决方案1】:

    如果地址不是 SSL/TLS ,在您的请求标头中发送类似 host: www.google.co.jp 的内容应该可以工作,至少 当目标 http 服务器使用基于名称的虚拟主机时。 https://en.wikipedia.org/wiki/Virtual_hosting#Name-based

    System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
    URL url = new URL("http://172.217.26.100/about/"); // one of the google IP
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    conn.setRequestProperty("host","www.google.co.jp"); // get japanese google site, you may obtain canada site by changing to `www.google.ca`
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    System.out.println(reader.readLine());
    

    出于 java 安全原因,需要设置 sun.net.http.allowRestrictedHeadersCan I override the Host header where using java's HttpUrlConnection class?

    【讨论】:

    • 我用google作为一个简单的例子。我不确定这种方法是否适用于更复杂的 URL(包括路径等)。
    • @RannLifshitz 我用路径更新了问题。我无法向您保证该代码在网站的所有 中都有效,但是基于名称的虚拟主机被广泛使用,因此它应该适用于大多数网站。如果您发现无法使用带有host 标头的 IP 地址请求的站点,请发布另一个问题。
    • 您建议如何处理基于 https 的 URL(当尝试根据服务器 IP 获取它们时)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2016-09-09
    • 2014-03-10
    • 2012-05-06
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多