Opretter forbindelse via proxyservere i Core Java

1. Introduktion

Proxy-servere fungerer som mellemled mellem klientapplikationer og andre servere. I en virksomhedsindstilling bruger vi dem ofte til at hjælpe med at give kontrol over det indhold, som brugerne bruger, normalt på tværs af netværksgrænser.

I denne vejledning ser vi på hvordan man opretter forbindelse via proxyservere i Java.

Først undersøger vi den ældre, mere globale tilgang, der er JVM-bred og konfigureret med systemegenskaber. Derefter introducerer vi Proxy klasse, hvilket giver os mere kontrol ved at tillade konfiguration pr. tilslutningsbasis.

2. Opsætning

For at køre eksemplerne i denne artikel skal vi have adgang til en proxyserver. Blæksprutte er en populær implementering, der er tilgængelig for de fleste operativsystemer. Standardkonfigurationen af ​​Blæksprutte vil være god nok til de fleste af vores eksempler.

3. Brug af en global indstilling

Java udsætter et sæt systemegenskaber, der kan bruges til at konfigurere JVM-opførsel. Denne "one size fits all-tilgang" er ofte den enkleste at implementere, hvis det er passende i brugssagen.

Vi kan indstil de krævede egenskaber fra kommandolinjen, når du påberåber JVM. Som et alternativ kan vi også indstil dem ved at ringe System.setProperty () ved kørselstid.

3.1. Tilgængelige systemegenskaber

Java leverer proxyhåndterere til HTTP-, HTTPS-, FTP- og SOCKS-protokoller. En proxy kan defineres for hver handler som værtsnavn og portnummer:

  • http.proxyHost - Værtsnavnet på HTTP-proxyserveren
  • http.proxyPort - Portnummeret på HTTP-proxyserveren - ejendom er valgfri og er som standard 80, hvis den ikke er angivet
  • http.nonProxyHosts - En pipeafgrænset liste (“|”) over værtsmønstre, som proxyen skal omgåes for - gælder for både HTTP- og HTTPS-håndterere, hvis de er indstillet
  • socksProxyHost- Værtsnavnet på SOCKS-proxyserveren
  • socksProxyPort- Portnummeret på SOCKS-proxyserveren

Hvis det specificeres nonProxyHostskan værtsmønstre starte eller slutte med et jokertegn (“*”). Det kan være nødvendigt at undslippe “|” afgrænsning på Windows-platforme. En udtømmende liste over alle tilgængelige proxy-relaterede systemegenskaber findes i Oracles officielle Java-dokumentation om netværksegenskaber.

3.2. Indstil via kommandolinjeargumenter

Vi kan definere fuldmagter på kommandolinjen ved at sende indstillingerne som systemegenskaber:

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

Når vi starter en proces på denne måde, er vi i stand til simpelthen at bruge openConnection () på den URL uden yderligere arbejde:

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

3.3. Indstil ved hjælp af System.setProperty (streng, streng)

Hvis vi ikke kan indstille proxyegenskaber på kommandolinjen, kan vi indstille dem med opkald til System.setProperty () inden for vores program:

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

Hvis vi senere frakobler de relevante systemegenskaber manuelt, bliver proxyen ikke længere brugt:

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

3.4. Begrænsninger for global konfiguration

Selvom det er let at implementere at bruge en global konfiguration med systemegenskaber, er denne tilgang begrænser, hvad vi kan gøre, fordi indstillingerne gælder for hele JVM. Af denne grund er indstillinger, der er defineret for en bestemt protokol, aktive i JVM's levetid, eller indtil de ikke er indstillet.

For at omgå denne begrænsning kan det være fristende at vende indstillingerne til og fra efter behov. For at gøre dette sikkert i et multitrådet program ville det være nødvendigt at indføre foranstaltninger til beskyttelse mod samtidige problemer.

Som et alternativ, Proxy API giver mere detaljeret kontrol over proxy konfiguration.

4. Brug af Proxy API

Det Proxy klasse giver os en fleksibel måde at konfigurere proxyer på per forbindelsesbasis. Hvis der er nogen eksisterende JVM-proxyindstillinger, skal forbindelsesbaserede proxyindstillinger ved hjælp af Proxy klasse tilsidesætter dem.

Der er tre typer fuldmagter, som vi kan definere ved Proxy.Type:

  • HTTP - en proxy ved hjælp af HTTP-protokollen
  • SOKKER - en proxy ved hjælp af SOCKS-protokollen
  • DIREKTE - en eksplicit konfigureret direkte forbindelse uden en proxy

4.1. Brug af en HTTP-proxy

For at bruge en HTTP-proxy skal vi først pak en SocketAddress eksempel med en Proxy og type Proxy.Type.HTTP. Dernæst passerer vi simpelthen Proxy eksempel til URLConnection.openConnection ():

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

Kort sagt betyder det, at vi opretter forbindelse til URL_STRING, men rute derefter forbindelsen gennem en proxyserver, der hostes på 127.0.0.1:3128.

4.2. Brug af en DIRECT Proxy

Vi har muligvis et krav om at oprette forbindelse direkte til en vært. I dette tilfælde kan vi udtrykkeligt omgå en proxy, der kan konfigureres globalt ved hjælp af det statiske Proxy.NO_PROXY eksempel. Under coveret konstruerer API en ny forekomst af Proxy for os ved hjælp af Proxy.Type.DIRECT som typen:

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

Dybest set, hvis der ikke er nogen globalt konfigureret proxy, så er dette det samme som at ringe openConnection () uden argumenter.

4.3. Brug af en SOCKS-proxy

Brug af en SOCKS-proxy svarer til HTTP-varianten, når du arbejder med URL-forbindelse. Vi starter med indpakning a SocketAddress eksempel med en Proxy ved hjælp af en type Proxy.Type.SOCKS. Bagefter passerer vi Proxy eksempel til URLConnection.openConnection:

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

Det er også muligt at Brug en SOCKS-proxy, når du opretter forbindelse til et TCP-stik. Først bruger vi Proxy eksempel for at konstruere en Stikkontakt. Bagefter vi passere destinationen SocketAddress eksempel til Socket.connect ():

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

5. Konklusion

I denne artikel kiggede vi på, hvordan man arbejder med proxyservere i core Java.

Først kiggede vi på den ældre, mere globale stil med forbindelse via proxyservere ved hjælp af systemegenskaber. Derefter så vi, hvordan man bruger Proxy klasse, som giver finkornet kontrol, når der oprettes forbindelse via proxyservere.

Som altid kan al kildekode, der bruges i denne artikel, findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found