Povezivanje putem proxy poslužitelja u jezgri Java

1. Uvod

Proxy poslužitelji djeluju kao posrednici između klijentskih aplikacija i drugih poslužitelja. U poslovnom okruženju često ih koristimo kako bismo osigurali kontrolu nad sadržajem koji korisnici konzumiraju, obično preko mrežnih granica.

U ovom uputstvu ćemo pogledati kako se povezati putem proxy poslužitelja u Javi.

Prvo ćemo istražiti stariji, globalniji pristup koji je širok JVM i konfiguriran sa svojstvima sustava. Poslije ćemo predstaviti Proxy klase, koja nam daje veću kontrolu dopuštajući konfiguraciju na osnovi veze.

2. Postavljanje

Da bismo pokrenuli uzorke u ovom članku, trebat će nam pristup proxy poslužitelju. Squid je popularna implementacija dostupna za većinu operativnih sustava. Zadana konfiguracija Squida bit će dovoljno dobra za većinu naših primjera.

3. Korištenje globalne postavke

Java izlaže skup sistemskih svojstava koja se mogu koristiti za konfiguriranje ponašanja na razini JVM-a. Ovaj pristup „jedne veličine odgovara svima“ često je najjednostavniji za primjenu ako je prikladan za slučaj upotrebe.

Možemo postavite potrebna svojstva iz naredbenog retka prilikom pozivanja JVM-a. Kao alternativu, također možemo postavite ih pozivom System.setProperty () za vrijeme izvođenja.

3.1. Dostupna svojstva sustava

Java nudi proxy rukovatelje za HTTP, HTTPS, FTP i SOCKS protokole. Proxy se može definirati za svakog obrađivača kao ime hosta i broj porta:

  • http.proxyHost - Ime hosta HTTP proxy poslužitelja
  • http.proxyPort - Broj porta HTTP proxy poslužitelja - svojstvo je neobavezno i ​​zadano je na 80 ako nije navedeno
  • http.nonProxyHosts - Popis uzoraka hosta razdvojenih cijevima ("|") za koje treba zaobići proxy - odnosi se i na HTTP i HTTPS rukovatelje ako je postavljen
  • socksProxyHost- Ime hosta proxy poslužitelja SOCKS
  • socksProxyPort- Broj porta proxy poslužitelja SOCKS

Ako se precizira nonProxyHosts, obrasci hosta mogu započeti ili završiti sa zamjenskim znakom ("*"). Možda će biti potrebno pobjeći od "|" graničnik na Windows platformama. Iscrpan popis svih dostupnih svojstava sustava koji se odnose na proxy može se naći u Oracleovoj službenoj Java dokumentaciji o mrežnim svojstvima.

3.2. Postavite putem argumenata naredbenog retka

Proksije na naredbenom retku možemo definirati dodavanjem postavki kao svojstava sustava:

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

Kada započinjemo postupak na ovaj način, možemo ga jednostavno koristiti openConnection () na URL bez ikakvog dodatnog rada:

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

3.3. Postavite pomoću System.setProperty (String, String)

Ako ne možemo postaviti svojstva proxyja na naredbeni redak, možemo ih postaviti pozivima na System.setProperty () u okviru našeg programa:

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

Ako kasnije ručno poništimo relevantna svojstva sustava, tada se više neće koristiti proxy:

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

3.4. Ograničenja globalne konfiguracije

Iako je korištenje globalne konfiguracije sa svojstvima sustava jednostavno implementirati, ovaj pristup ograničava ono što možemo učiniti jer se postavke primjenjuju na čitav JVM. Iz tog su razloga postavke definirane za određeni protokol aktivne tijekom života JVM-a ili dok se ne postave.

Da biste zaobišli ovo ograničenje, možda bi bilo primamljivo uključiti i isključiti postavke po potrebi. Da biste to učinili sigurno u programu s više niti, bilo bi potrebno uvesti mjere za zaštitu od istodobnosti.

Kao alternativa, Proxy API pruža detaljniju kontrolu nad konfiguracijom proxyja.

4. Korištenje Proxy API

The Proxy klasa daje nam fleksibilan način konfiguriranja proxyja na osnovi veze. Ako postoje postojeće postavke proxyja za JVM, postavke proxyja temeljene na povezivanju pomoću Proxy razred će ih nadvladati.

Postoje tri vrste opunomoćenika koje možemo definirati Proxy.Type:

  • HTTP - proxy koji koristi HTTP protokol
  • ČARAPE - proxy koji koristi SOCKS protokol
  • DIREKTNO - izričito konfigurirana izravna veza bez proxyja

4.1. Korištenje HTTP proxyja

Prvo koristimo HTTP proxy zamotati a Adresa utičnice primjer s a Proxy i vrsta Proxy.Type.HTTP. Dalje, jednostavno prolazimo Proxy primjer do URLConnection.openConnection ():

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

Jednostavno rečeno, to znači da ćemo se povezati s URL_STRING, ali zatim usmjeri tu vezu preko proxy poslužitelja hostiranog na 127.0.0.1:3128.

4.2. Korištenje DIRECT proxyja

Možda imamo zahtjev za izravnim povezivanjem s hostom. U ovom slučaju možemo izričito zaobići proxy koji se globalno može konfigurirati pomoću statičkog Proxy.NO_PROXY primjer. Pod naslovnicama, API konstruira novu instancu Proxy za nas, koristeći Proxy.Type.DIRECT kao tip:

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

U osnovi, ako nema globalno konfiguriranog proxyja, to je isto kao i pozivanje openConnection () bez argumenata.

4.3. Korištenje SOCKS proxyja

Korištenje proxyja SOCKS slično je HTTP varijanti pri radu s URLConnection. Počinjemo od omatanje a Adresa utičnice primjer s a Proxy koristeći vrstu Proxy.Type.SOCKS. Poslije prolazimo Proxy primjer do URLConnection.openConnection:

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

Također je moguće koristite proxy SOCKS prilikom povezivanja na TCP utičnicu. Prvo, koristimo Proxy instancu za konstrukciju a Utičnica. Poslije smo proći odredište Adresa utičnice primjer do Socket.connect ():

Socket proxySocket = nova utičnica (socksProxy); InetSocketAddress socketHost = nova InetSocketAddress (SOCKET_SERVER_HOST, SOCKET_SERVER_PORT); proxySocket.connect (socketHost);

5. Zaključak

U ovom smo članku pogledali kako raditi s proxy poslužiteljima u jezgri Java.

Prvo smo pogledali stariji, globalniji stil povezivanja putem proxy poslužitelja pomoću svojstava sustava. Zatim smo vidjeli kako se koristi Proxy klase, koja pruža preciznu kontrolu prilikom povezivanja putem proxy poslužitelja.

Kao i uvijek, sav izvorni kod korišten u ovom članku možete pronaći na GitHubu.