Verbindung über Proxyserver in Core Java herstellen

1. Einleitung

Proxyserver fungieren als Vermittler zwischen Clientanwendungen und anderen Servern. In Unternehmen verwenden wir sie häufig, um die Kontrolle über den Inhalt zu ermöglichen, den Benutzer normalerweise über Netzwerkgrenzen hinweg konsumieren.

In diesem Tutorial erfahren Sie, wie Sie eine Verbindung über Proxyserver in Java herstellen .

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

2. Setup

Um die Beispiele in diesem Artikel ausführen zu können, 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, mit denen das JVM-weite Verhalten konfiguriert werden kann. Dieser „One Size Fits All-Ansatz“ ist häufig am einfachsten zu implementieren, wenn er für den Anwendungsfall geeignet ist.

Wir können die erforderlichen Eigenschaften über die Befehlszeile festlegen, wenn wir die JVM aufrufen . Alternativ können wir sie auch festlegen, indem wir zur Laufzeit System.setProperty () aufrufen .

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 HTTP-Proxyserver-Eigenschaft 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 Sie nonProxyHosts angeben , können Hostmuster mit einem Platzhalterzeichen („*“) beginnen oder enden. Möglicherweise muss das "|" Trennzeichen auf Windows-Plattformen. Eine vollständige Liste aller verfügbaren Proxy-bezogenen Systemeigenschaften finden Sie in der offiziellen Java-Dokumentation von Oracle zu Netzwerkeigenschaften.

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.baeldung.networking.proxies.CommandLineProxyDemo

Wenn Sie einen Prozess auf diese Weise starten, können Sie einfach openConnection () für die URL ohne zusätzliche Arbeit verwenden:

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

3.3. Mit System.setProperty festlegen (String, String)

Wenn wir keine Proxy-Eigenschaften in der Befehlszeile festlegen können, können wir sie mit Aufrufen von System.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 die relevanten Systemeigenschaften später 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, schränkt dieser Ansatz die Möglichkeiten ein, da die Einstellungen für die gesamte JVM gelten . Aus diesem Grund sind die für ein bestimmtes Protokoll definierten Einstellungen für die Lebensdauer der JVM oder bis zum Deaktivieren 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üssten Maßnahmen zum Schutz vor Parallelitätsproblemen eingeführt werden.

Alternativ bietet die Proxy-API eine detailliertere Kontrolle über die Proxy-Konfiguration.

4. Verwenden der Proxy- API

Die Proxy- Klasse bietet 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 Proxy- Klasse überschrieben.

Es gibt drei Arten von Proxys, die wir mit Proxy.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, wird zuerst eine SocketAddress- Instanz mit einem Proxy und dem Typ Proxy.Type.HTTP umbrochen . Als Nächstes übergeben wir einfach die Proxy- Instanz an URLConnection.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 zu URL_STRING herstellen und diese Verbindung dann über einen Proxyserver weiterleiten, der unter 127.0.0.1:3128 gehostet wird .

4.2. Verwenden eines DIRECT-Proxys

Möglicherweise müssen wir uns direkt mit einem Host verbinden. In diesem Fall können wir einen Proxy explizit umgehen, der mithilfe der statischen Instanz Proxy.NO_PROXY global konfiguriert werden kann . Unter dem Deckmantel erstellt die API eine neue Instanz von Proxy für uns, wobei Proxy.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 von openConnection () ohne Argumente.

4.3. Verwenden eines SOCKS-Proxys

Using a SOCKS proxy is similar to the HTTP variant when working with URLConnection. We start by wrapping a SocketAddress instance with a Proxy using a type of Proxy.Type.SOCKS. Afterward, we pass the Proxy instance to URLConnection.openConnection:

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

It's also possible to use a SOCKS proxy when connecting to a TCP socket. First, we use the Proxy instance to construct a Socket. Afterward, we pass 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. Conclusion

In this article, we looked at how to work with proxy servers in core Java.

Zunächst haben wir uns den älteren, globaleren Verbindungsstil über Proxyserver mithilfe von Systemeigenschaften angesehen. Dann haben wir gesehen, wie die Proxy- Klasse verwendet wird, die eine differenzierte Steuerung beim Herstellen einer Verbindung über Proxyserver bietet.

Wie immer finden Sie den gesamten in diesem Artikel verwendeten Quellcode auf GitHub.