2016-08-08 43 views
1

Es gibt viele Anleitungen zum Herunterladen einer Webseite, deren URL in Java angegeben ist. In diesem Fall wird die Webseite von einem Server heruntergeladen, der vom DNS bereitgestellt wird (der die IP eines der Server zurückgibt, die die Webseite hosten).Java: Laden Sie eine Webseite mit einer URL von einem bestimmten Server herunter ip

Meine Frage ist - eine bestimmte IP eines Servers gegeben, wie kann ich eine Web-Seite herunterladen gehostet auf dem bestimmten Server mit seiner URL?

Bearbeiten: Um die Frage zu klären, betrachten Sie eine Website wie Google, die von mehreren Servern gehostet wird. Wenn ich die Webseite nur mit der URL "www.google.com" herunterladen würde, würde mir die Webseite von einem der Hosting-Server zur Verfügung gestellt (die der DNS auswählen würde). Angenommen, ich besitze die IP eines der Server, die "www.google.com" hosten, und möchte die Webseite speziell von diesem Server herunterladen. Ich könnte die URL nicht alleine verwenden, da ich keine Garantien hätte dass ich die Webseite vom richtigen Server heruntergeladen habe.

Edit 2: Eine vollständige Antwort auf diese Frage sollte auch https-Protokolle unterstützen.

+0

Können Sie die Frage näher erläutern? Sie meinen, dass der Server so etwas wie einen virtuellen Host verwendet? – ymonad

+0

Funktioniert es, wenn Sie nur die IP-Adresse anstelle des Hostnamens in die URL eingeben? (Das funktioniert möglicherweise nicht, wenn der Server den Hostnamen in der Anfrage benötigt) – Thilo

+0

Siehe Ausarbeitung in der obigen Bearbeitung. Funktioniert nicht, indem der Hostname durch die IP-Adresse ersetzt wird. –

Antwort

2

Wenn die Adresse nicht SSL/TLS ist, sollte in Ihrem Anforderungsheader so etwas wie host: www.google.co.jp gesendet werden, mindestens , wenn der Ziel-HTTP-Server namensbasiertes virtuelles Hosting verwendet. 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()); 

Einstellung sun.net.http.allowRestrictedHeaders ist für Java-Sicherheits Grund erforderlich: Can I override the Host header where using java's HttpUrlConnection class?

+0

Ich habe Google als ein einfaches Beispiel verwendet. Ich bin nicht sicher, ob dieser Ansatz mit komplexeren URLs funktionieren würde (einschließlich Pfaden usw.). –

+1

@RannLifshitz Ich habe die Frage mit Pfad aktualisiert. Ich kann Ihnen nicht versichern, dass der Code in * all * der Site funktioniert, aber namensbasiertes virtuelles Hosting ist weit verbreitet, daher sollte es in den meisten Sites funktionieren. Bitte posten Sie eine andere Frage, wenn Sie eine Website finden, die Sie nicht verwenden können IP-Adresse Anfrage mit 'Host'-Header. – ymonad

+0

Wie würden Sie vorschlagen, https-basierte URLs zu behandeln (wenn Sie versuchen, sie basierend auf der IP des Servers zu erhalten)? –