Verbinding maken via proxyservers in Core Java

1. Inleiding

Proxyservers fungeren als tussenpersoon tussen clienttoepassingen en andere servers. In een zakelijke omgeving gebruiken we ze vaak om controle te bieden over de inhoud die gebruikers consumeren, meestal over netwerkgrenzen heen.

In deze tutorial zullen we kijken naar hoe u verbinding kunt maken via proxyservers in Java.

Eerst zullen we de oudere, meer globale benadering onderzoeken die JVM-breed is en geconfigureerd met systeemeigenschappen. Daarna introduceren we de Proxy class, wat ons meer controle geeft door configuratie per verbinding mogelijk te maken.

2. Installatie

Om de voorbeelden in dit artikel uit te voeren, hebben we toegang tot een proxyserver nodig. Squid is een populaire implementatie die beschikbaar is voor de meeste besturingssystemen. De standaardconfiguratie van Squid is goed genoeg voor de meeste van onze voorbeelden.

3. Met behulp van een algemene instelling

Java legt een set systeemeigenschappen bloot die kunnen worden gebruikt om JVM-breed gedrag te configureren. Deze "one size fits all" -benadering is vaak de eenvoudigste om te implementeren als deze geschikt is voor het gebruik.

Wij kunnen stel de vereiste eigenschappen in vanaf de opdrachtregel bij het aanroepen van de JVM. Als alternatief kunnen we dat ook stel ze in door te bellen System.setProperty () tijdens runtime.

3.1. Beschikbare systeemeigenschappen

Java biedt proxyhandlers voor HTTP-, HTTPS-, FTP- en SOCKS-protocollen. Een proxy kan voor elke handler worden gedefinieerd als een hostnaam en poortnummer:

  • http.proxyHost - De hostnaam van de HTTP-proxyserver
  • http.proxyPort - Het poortnummer van de HTTP-proxyserver - eigenschap is optioneel en wordt standaard 80 indien niet opgegeven
  • http.nonProxyHosts - Een door buizen gescheiden ("|") lijst met hostpatronen waarvoor de proxy moet worden omzeild - is van toepassing op zowel de HTTP- als de HTTPS-handlers, indien ingesteld
  • sokkenProxyHost- De hostnaam van de SOCKS-proxyserver
  • sokkenProxyPort- Het poortnummer van de SOCKS-proxyserver

Als u specificeert nonProxyHosts, hostpatronen kunnen beginnen of eindigen met een jokerteken ("*"). Het kan nodig zijn om te ontsnappen aan de "|" scheidingsteken op Windows-platforms. Een volledige lijst van alle beschikbare proxygerelateerde systeemeigenschappen is te vinden in de officiële Java-documentatie van Oracle over netwerkeigenschappen.

3.2. Instellen via opdrachtregelargumenten

We kunnen proxy's op de opdrachtregel definiëren door de instellingen door te geven als systeemeigenschappen:

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

Wanneer we op deze manier een proces starten, kunnen we eenvoudig gebruiken openConnection () op de URL zonder extra werk:

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

3.3. Stel in met System.setProperty (String, String)

Als we geen proxy-eigenschappen op de opdrachtregel kunnen instellen, kunnen we ze instellen met aanroepen naar System.setProperty () binnen ons programma:

System.setProperty ("http.proxyHost", "127.0.0.1"); System.setProperty ("http.proxyPort", "3128"); URL url = nieuwe URL (RESOURCE_URL); URLConnection con = url.openConnection (); // ...

Als we de relevante systeemeigenschappen later handmatig uitschakelen, wordt de proxy niet langer gebruikt:

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

3.4. Beperkingen van algemene configuratie

Hoewel het gebruik van een globale configuratie met systeemeigenschappen eenvoudig te implementeren is, is deze benadering beperkt wat we kunnen doen omdat de instellingen van toepassing zijn op de hele JVM. Om deze reden zijn de instellingen die voor een bepaald protocol zijn gedefinieerd, actief gedurende de levensduur van de JVM of totdat ze niet meer worden ingesteld.

Om deze beperking te omzeilen, kan het verleidelijk zijn om de instellingen indien nodig aan en uit te zetten. Om dit veilig te doen in een multi-threaded programma, zou het nodig zijn om maatregelen te nemen ter bescherming tegen gelijktijdigheidsproblemen.

Als een alternatief, de Proxy-API biedt meer gedetailleerde controle over de proxyconfiguratie.

4. Gebruik de Proxy API

De Proxy class geeft ons een flexibele manier om proxy's per verbinding te configureren. Als er bestaande JVM-brede proxy-instellingen zijn, kunnen verbindingsgebaseerde proxy-instellingen de Proxy klasse zal ze negeren.

Er zijn drie soorten proxy's die we kunnen definiëren Proxy. Type:

  • HTTP - een proxy die het HTTP-protocol gebruikt
  • SOKKEN - een proxy die het SOCKS-protocol gebruikt
  • DIRECT - een expliciet geconfigureerde directe verbinding zonder een proxy

4.1. Met behulp van een HTTP-proxy

Om een ​​HTTP-proxy te gebruiken, moeten we eerst wikkel een SocketAddress instantie met een Proxy en type Proxy.Type.HTTP. Vervolgens passeren we gewoon de Proxy instantie naar URLConnection.openConnection ():

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

Simpel gezegd, dit betekent dat we verbinding maken met URL_STRING, maar leid die verbinding vervolgens via een proxyserver die wordt gehost op 127.0.0.1:3128.

4.2. Met behulp van een DIRECTE proxy

Mogelijk moeten we rechtstreeks verbinding maken met een host. In dit geval kunnen we expliciet omzeil een proxy die globaal kan worden geconfigureerd met behulp van de static Proxy.NO_PROXY voorbeeld. Onder de dekens bouwt de API een nieuw exemplaar van Proxy voor ons, met behulp van Proxy.Type.DIRECT als het type:

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

Als er geen globaal geconfigureerde proxy is, is dit in feite hetzelfde als bellen openConnection () zonder argumenten.

4.3. Met behulp van een SOCKS-proxy

Het gebruik van een SOCKS-proxy is vergelijkbaar met de HTTP-variant bij het werken met URLConnection. We beginnen met inpakken een SocketAddress instantie met een Proxy met behulp van een type Proxy.Type.SOCKS. Daarna passeren we de Proxy instantie naar URLConnection.openConnection:

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

Het is ook mogelijk om gebruik een SOCKS-proxy bij het verbinden met een TCP-socket. Ten eerste gebruiken we de Proxy instantie om een Stopcontact. Daarna hebben we passeer de bestemming SocketAddress instantie naar Socket.connect ():

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

5. Conclusie

In dit artikel hebben we gekeken naar het werken met proxyservers in core Java.

Eerst hebben we gekeken naar de oudere, meer globale stijl van verbinding maken via proxyservers met behulp van systeemeigenschappen. Vervolgens hebben we gezien hoe we de Proxy class, die fijnmazige controle biedt bij het verbinden via proxyservers.

Zoals altijd is alle broncode die in dit artikel wordt gebruikt, te vinden op GitHub.