Verbindung über Proxyserver in Core Java

Verbindung über Proxy-Server in Core Java

1. Einführung

Proxyserver fungieren als Vermittler zwischen Clientanwendungen und anderen Servern. In Unternehmen werden sie häufig verwendet, um die Kontrolle über die von Benutzern verwendeten Inhalte zu ermöglichen, in der Regel über Netzwerkgrenzen hinweg.

In diesem Tutorial sehen wir unshow to connect through proxy servers in Java an.

Zunächst werden wir den älteren, globaleren Ansatz untersuchen, der JVM-weit ist und mit Systemeigenschaften konfiguriert wird. Anschließend führen wir dieProxy-Klasse ein, die uns mehr Kontrolle gibt, indem die Konfiguration pro Verbindung zugelassen wird.

2. Konfiguration

Zum Ausführen der Beispiele in diesem Artikel benötigen wir Zugriff auf einen Proxyserver. Squid ist eine beliebte Implementierung, die für die meisten Betriebssysteme verfügbar ist. Die Standardkonfiguration von Squid ist für die meisten unserer Beispiele ausreichend.

3. Verwenden einer globalen Einstellung

Java stellt eine Reihe von Systemeigenschaften zur Verfügung, die zum Konfigurieren des JVM-weiten Verhaltens verwendet werden können. Dieser "One Size Fits All" -Ansatz ist häufig am einfachsten zu implementieren, wenn er für den Anwendungsfall geeignet ist.

Wir könnenset the required properties from the command line when invoking the JVM. Alternativ können wir auchset them by calling System.setProperty() at runtime.

3.1. Verfügbare Systemeigenschaften

Java bietet Proxy-Handler für die Protokolle HTTP, HTTPS, FTP und SOCKS. Für jeden Handler kann ein Proxy als Hostname und Portnummer definiert werden:

  • http.proxyHost - Der Hostname des HTTP-Proxyservers

  • http.proxyPort - Die Portnummer der Eigenschaft HTTP-Proxyserver - ist optional und standardmäßig 80, wenn sie nicht angegeben wird

  • http.nonProxyHosts - Eine durch Pipe getrennte ("|") Liste von Hostmustern, für die der Proxy umgangen werden soll - gilt sowohl für die HTTP- als auch für die HTTPS-Handler, falls festgelegt

  • socksProxyHost - Der Hostname des SOCKS-Proxyservers

  • socksProxyPort - Die Portnummer des SOCKS-Proxyservers

Wenn SienonProxyHosts angeben, können Hostmuster mit einem Platzhalterzeichen („*“) beginnen oder enden. Auf Windows-Plattformen kann es erforderlich sein, das Trennzeichen "|" zu umgehen. Eine vollständige Liste aller verfügbaren Proxy-bezogenen Systemeigenschaften finden Sie inOracle’s official Java documentation on networking properties.

3.2. Über Befehlszeilenargumente festlegen

Wir können Proxys in der Befehlszeile definieren, indem wir die Einstellungen als Systemeigenschaften übergeben:

java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 com.example.networking.proxies.CommandLineProxyDemo

Wenn Sie einen Prozess auf diese Weise starten, können Sie einfachopenConnection() fürURL ohne zusätzliche Arbeit verwenden:

URL url = new URL(RESOURCE_URL);
URLConnection con = url.openConnection();

3.3. MitSystem.setProperty(String, String) einstellen

Wenn wir keine Proxy-Eigenschaften in der Befehlszeile festlegen können, können wir sie mit Aufrufen vonSystem.setProperty() in unserem Programm festlegen:

System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "3128");

URL url = new URL(RESOURCE_URL);
URLConnection con = url.openConnection();
// ...

Wenn wir später die relevanten Systemeigenschaften manuell deaktivieren, wird der Proxy nicht mehr verwendet:

System.setProperty("http.proxyHost", null);

3.4. Einschränkungen der globalen Konfiguration

Obwohl die Verwendung einer globalen Konfiguration mit Systemeigenschaften einfach zu implementieren ist, ist dieser Ansatzlimits what we can do because the settings apply across the entire JVM. Aus diesem Grund sind Einstellungen, die für ein bestimmtes Protokoll definiert wurden, für die Lebensdauer der JVM oder bis zu ihrer Deaktivierung aktiv.

Um diese Einschränkung zu umgehen, ist es möglicherweise verlockend, die Einstellungen nach Bedarf ein- und auszuschalten. Um dies in einem Multithread-Programm sicher zu tun, müssen Maßnahmen zum Schutz vor Problemen mit der Parallelität eingeführt werden.

Alternativ könnenthe Proxy API provides more granular control over proxy configuration.

4. Verwenden derProxy-API

Die KlasseProxybietet uns eine flexible Möglichkeit, Proxys pro Verbindung zu konfigurieren. Wenn JVM-weite Proxy-Einstellungen vorhanden sind, werden diese durch verbindungsbasierte Proxy-Einstellungen mit der KlasseProxyüberschrieben.

Es gibt drei Arten von Proxys, die wir durchProxy.Type definieren können:

  • HTTP - ein Proxy, der das HTTP-Protokoll verwendet

  • SOCKS - ein Proxy, der das SOCKS-Protokoll verwendet

  • DIRECT - eine explizit konfigurierte direkte Verbindung ohne Proxy

4.1. Verwenden eines HTTP-Proxys

Um einen HTTP-Proxy zu verwenden, müssen wir zuerstwrap a SocketAddress instance with a Proxy and type of Proxy.Type.HTTP. Als nächstes übergeben wir einfach die Instanz vonProxyanURLConnection.openConnection():

URL weburl = new URL(URL_STRING);
Proxy webProxy
  = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128));
HttpURLConnection webProxyConnection
  = (HttpURLConnection) weburl.openConnection(webProxy);

Einfach ausgedrückt bedeutet dies, dass wir eine Verbindung zuURL_STRING herstellen und diese Verbindung dann über einen Proxyserver weiterleiten, der bei127.0.0.1:3128 gehostet wird.

4.2. Verwenden eines DIRECT-Proxys

Möglicherweise müssen wir eine direkte Verbindung zu einem Host herstellen. In diesem Fall können wir die Instanz vonbypass a proxy that may be configured globally by using the static Proxy.NO_PROXYexplizit verwenden. Unter dem Deckmantel erstellt die API eine neue Instanz vonProxy für uns, wobeiProxy.Type.DIRECT als Typ: verwendet wird

HttpURLConnection directConnection
  = (HttpURLConnection) weburl.openConnection(Proxy.NO_PROXY);

Wenn es keinen global konfigurierten Proxy gibt, entspricht dies im Grunde dem Aufruf vonopenConnection() ohne Argumente.

4.3. Verwenden eines SOCKS-Proxys

Die Verwendung eines SOCKS-Proxys ähnelt der HTTP-Variante bei der Arbeit mitURLConnection.. Wir beginnen mitwrapping a SocketAddress instance with a Proxy using a type of Proxy.Type.SOCKS. Danach übergeben wir die Instanz vonProxyanURLConnection.openConnection:

Proxy socksProxy
  = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1080));
HttpURLConnection socksConnection
  = (HttpURLConnection) weburl.openConnection(socksProxy);

Es ist auch möglich,use a SOCKS proxy when connecting to a TCP socket. Zuerst verwenden wir die InstanzProxy, umSocket zu konstruieren. Danach haben wirpass the destination SocketAddress instance to Socket.connect():

Socket proxySocket = new Socket(socksProxy);
InetSocketAddress socketHost
  = new InetSocketAddress(SOCKET_SERVER_HOST, SOCKET_SERVER_PORT);
proxySocket.connect(socketHost);

5. Fazit

In diesem Artikel haben wir uns mit der Arbeit mit Proxyservern in Core Java befasst.

Zuerst haben wir uns den älteren, globaleren Verbindungsstil über Proxy-Server unter Verwendung von Systemeigenschaften angesehen. Dann haben wir gesehen, wie die KlasseProxyverwendet wird, die eine differenzierte Steuerung bei der Verbindung über Proxyserver bietet.

Wie immer befindet sich der gesamte in diesem Artikel verwendete Quellcode überon GitHub.