Wie kann ich dafür sorgen, dass HttpURLConnection einen Proxy verwendet?

136

Wenn ich das mache ...

conn = new URL(urlString).openConnection();
System.out.println("Proxy? " + conn.usingProxy());

es druckt

Proxy? false

Das Problem ist, ich bin hinter einem Proxy. Woher bezieht die JVM ihre Proxy-Informationen unter Windows? Wie richte ich das ein? Alle meine anderen Apps scheinen mit meinem Proxy vollkommen zufrieden zu sein.

izb
quelle

Antworten:

336

Seit Java 1.5 können Sie auch eine java.net.Proxy- Instanz an die openConnection(proxy)Methode übergeben:

//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);

Wenn Ihr Proxy eine Authentifizierung erfordert, erhalten Sie die Antwort 407.

In diesem Fall benötigen Sie den folgenden Code:

    Authenticator authenticator = new Authenticator() {

        public PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("user",
                    "password".toCharArray()));
        }
    };
    Authenticator.setDefault(authenticator);
NickDK
quelle
7
Können wir einen Proxy-Benutzernamen und ein Proxy-Passwort angeben?
Xolve
15
Was ist, wenn Sie unterschiedliche Benutzername / Passwort-Paare für die verschiedenen Proxys haben? Das Aufrufen einer statischen Methode zum Festlegen des Standardauthentifizierers ist nicht ideal. Dies ist nicht viel besser als das Festlegen der Sys-Eigenschaftenmethode.
JavaPhobic
2
Authenticator.default ist eine statische (dh globale) Variable, daher nur einmal. Beachten Sie jedoch, dass der obige Authenticator nur ein minimales Beispiel ist. Es kann jeweils nur ein Kennwort verarbeitet werden. Google für Beispiele, die mehrere Hosts mit unterschiedlichen Passwörtern verarbeiten können.
Stroboskop
3
Da 8u11 dies bei der Standardauthentifizierung standardmäßig nicht funktioniert, muss die Systemeigenschaft oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes auf leer gesetzt werden
weiß
3
Falls Sie eine Domain haben. Gehen Sie wie folgt vor:new PasswordAuthentication("domainName\\user", "password".toCharArray());
Entwickler Marius Žilėnas
34

Dies ist ziemlich einfach aus dem Internet zu beantworten. Legen Sie die Systemeigenschaften http.proxyHostund fest http.proxyPort. Sie können dies mit System.setProperty()oder über die Befehlszeile mit der -DSyntax tun .

Sean Owen
quelle
19

Proxys werden über zwei Systemeigenschaften unterstützt: http.proxyHost und http.proxyPort. Sie müssen auf den Proxyserver bzw. den Port eingestellt sein. Das folgende grundlegende Beispiel veranschaulicht dies:

String url = "http://www.google.com/",
       proxy = "proxy.mydomain.com",
       port = "8080";
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxy);
systemProperties.setProperty("http.proxyPort",port);
HttpURLConnection connection = (HttpURLConnection)server.openConnection();
connection.connect();
InputStream in = connection.getInputStream();
readResponse(in);
Pascal Thivent
quelle
@Pascal Wissen Sie zufällig, was die Hauptunterschiede bei der Verwendung des neuesten Java-Ansatzes im Vergleich zu Apache sind commons-httpclient? Da Java Proxy und Authentifizierung unterstützt (wie Sie hier erwähnt haben stackoverflow.com/questions/1626549/… ), gibt es für einfache Fälle (wie das Abrufen einer Datei vom öffentlichen HTTP-Server) keinen Grund, die Apache-Bibliothek zu verwenden. Was ist Ihre Empfehlung?
dma_k
@dma_k Ich stimme Ihnen zu, für einfache Anwendungsfälle wie den von Ihnen beschriebenen würde ich keine Bibliothek eines Drittanbieters verwenden.
Pascal Thivent
Wissen Sie, wie Sie die nonProxyHosts unterstützen können? Ich sehe, dass mein Gerät dies unterstützt, weiß aber nicht, wie meine App damit umgehen soll.
RiRomain
Aber Variable systemPropertieswird nicht von der connection!
Parsecer
12

Sie können auch einstellen

-Djava.net.useSystemProxies=true

Unter Windows und Linux werden die Systemeinstellungen verwendet, sodass Sie sich nicht wiederholen müssen (DRY).

http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies

Daniel Worthington-Bodart
quelle
6
Dies funktioniert nur bei manueller Proxy-Server-Konfiguration. Die automatische Proxy-Konfiguration und die über das Skript konfigurierten Proxys werden (noch) nicht an "useSystemProxies" weitergegeben.
Reifen
1
Dies funktionierte bei mir, als der ProxyHost eingestellt wurde und ProxyPort nicht. Vielen Dank!
Nrobey
Ebenso funktionierte dies hinter meinem Firmenvertreter, als Anrufe System.setPropertyfür die https.proxyHostund https.proxyPortaus irgendeinem Grund nicht den Senf schnitten.
Pavel Komarov
10

Stellen Sie Folgendes ein, bevor Sie Connection öffnen:

System.setProperty("http.proxyHost", "host");
System.setProperty("http.proxyPort", "port_number");

Wenn der Proxy eine Authentifizierung erfordert,

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");
ZZ Coder
quelle
7
Ich denke tatsächlich, dass "http.proxyUser" und "http.proxyPassword" nicht mehr unterstützt werden. Weitere Informationen finden Sie unter stackoverflow.com/questions/120797/… .
p3t0r
5

Für Java 1.8 und höher müssen Sie festlegen -Djdk.http.auth.tunneling.disabledSchemes=, dass Proxys mit Basisautorisierung mit https arbeiten.

Anton
quelle
1
Hintergrundinformationen hierzu finden Sie unter stackoverflow.com/questions/41806422/…
U880D
2

Die genehmigte Antwort funktioniert ... wenn Sie Ihren Proxy-Host und Port kennen =). Falls Sie jedoch nach dem Proxy-Host und dem Port suchen, sollten die folgenden Schritte hilfreich sein

Wenn ein automatisch konfigurierter Proxy angegeben ist: dann

1> IE (oder einen beliebigen Browser) öffnen

2> Holen Sie sich die URL-Adresse von Ihrem Browser über IE-> Tools-> Internetoption-> Verbindungen-> LAN-Einstellungen-> Adresse abrufen und geben Sie die URL ein, z. B.: Als http://autocache.abc.com/ und geben Sie ein, a Die Datei wird im .pac-Format heruntergeladen und auf dem Desktop gespeichert

3> Öffnen Sie die .pac-Datei im Textpad und identifizieren Sie PROXY:

In Ihrem Editor wird es ungefähr so ​​kommen:

return "PROXY web-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080";

Ein großes Lob an Mur von Maven in 5 Minuten nicht funktioniert

Sobald Sie den Host und den Port haben, kommen Sie einfach dazu und Sie können loslegen

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
Norbert
quelle