Koble til via proxy-servere i Core Java

1. Introduksjon

Proxy-servere fungerer som mellomledd mellom klientapplikasjoner og andre servere. I bedriftsinnstillinger bruker vi dem ofte til å gi kontroll over innholdet brukerne bruker, vanligvis på tvers av nettverksgrenser.

I denne opplæringen vil vi se på hvordan du kobler til via proxy-servere i Java.

Først skal vi utforske den eldre, mer globale tilnærmingen som er JVM-bred og konfigurert med systemegenskaper. Etterpå introduserer vi Fullmektig klasse, som gir oss mer kontroll ved å tillate konfigurasjon per tilkoblingsbasis.

2. Oppsett

For å kjøre eksemplene i denne artikkelen trenger vi tilgang til en proxy-server. Squid er en populær implementering som er tilgjengelig for de fleste operativsystemer. Standardkonfigurasjonen av blekksprut vil være god nok for de fleste av eksemplene våre.

3. Bruke en global setting

Java avslører et sett med systemegenskaper som kan brukes til å konfigurere JVM-atferd. Denne "en størrelse passer alle tilnærminger" er ofte den enkleste å implementere hvis den passer for brukssaken.

Vi kan angi de nødvendige egenskapene fra kommandolinjen når du påkaller JVM. Som et alternativ kan vi også sett dem ved å ringe System.setProperty () ved kjøretid.

3.1. Tilgjengelige systemegenskaper

Java tilbyr proxy-håndtere for HTTP-, HTTPS-, FTP- og SOCKS-protokoller. En proxy kan defineres for hvert behandler som vertsnavn og portnummer:

  • http.proxyHost - Vertsnavnet til HTTP-proxy-serveren
  • http.proxyPort - Portnummeret til HTTP-proxy-serveren - egenskapen er valgfri og er standard 80 hvis den ikke er oppgitt
  • http.nonProxyHosts - En røravgrenset (“|”) - liste over vertsmønstre som proxyen skal omgåes for - gjelder både HTTP- og HTTPS-håndterere hvis angitt
  • socksProxyHost- Vertsnavnet til SOCKS proxy-serveren
  • socksProxyPort- Portnummeret til SOCKS proxy-serveren

Hvis du spesifiserer nonProxyHostskan vertsmønstre starte eller slutte med et jokertegn (“*”). Det kan være nødvendig å unnslippe “|” avgrensning på Windows-plattformer. En uttømmende liste over alle tilgjengelige proxy-relaterte systemegenskaper finner du i Oracles offisielle Java-dokumentasjon om nettverksegenskaper.

3.2. Sett via kommandolinjeargumenter

Vi kan definere fullmakter på kommandolinjen ved å sende inn innstillingene som systemegenskaper:

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

Når du starter en prosess på denne måten, kan vi bare bruke openConnection ()URL uten noe ekstra arbeid:

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

3.3. Still inn med System.setProperty (streng, streng)

Hvis vi ikke kan angi proxyegenskaper på kommandolinjen, kan vi angi dem med anrop til System.setProperty () innenfor vårt 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 deaktiverer de aktuelle systemegenskapene manuelt, vil ikke proxyen lenger brukes:

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

3.4. Begrensninger for global konfigurasjon

Selv om det er enkelt å implementere en global konfigurasjon med systemegenskaper, er denne tilnærmingen begrenser hva vi kan gjøre fordi innstillingene gjelder for hele JVM. Av denne grunn er innstillinger som er definert for en bestemt protokoll, aktive i JVM-levetiden eller til de ikke er angitt.

For å omgå denne begrensningen, kan det være fristende å slå innstillingene av og på etter behov. For å gjøre dette trygt i et program med flere tråder, ville det være nødvendig å innføre tiltak for å beskytte mot samtidige problemer.

Som et alternativ, Proxy API gir mer detaljert kontroll over proxy-konfigurasjon.

4. Bruke Fullmektig API

De Fullmektig klasse gir oss en fleksibel måte å konfigurere proxyer på per tilkoblingsbasis. Hvis det er noen eksisterende JVM-proxy-innstillinger, kan du bruke tilkoblingsbaserte proxy-innstillinger med Fullmektig klasse overstyrer dem.

Det er tre typer fullmakter som vi kan definere etter Proxy.Type:

  • HTTP - en proxy som bruker HTTP-protokollen
  • SOKKER - en fullmektig som bruker SOCKS-protokollen
  • DIREKTE - en eksplisitt konfigurert direkte forbindelse uten proxy

4.1. Bruke en HTTP-proxy

For å bruke en HTTP-proxy, først pakk en SocketAddress eksempel med en Fullmektig og type Proxy.Type.HTTP. Deretter passerer vi ganske enkelt Fullmektig eksempel til URLConnection.openConnection ():

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

Enkelt sagt, dette betyr at vi kobler til URL_STRING, men rut deretter tilkoblingen gjennom en proxy-server som er vert på 127.0.0.1:3128.

4.2. Bruke en DIREKTE proxy

Vi kan ha et krav om å koble direkte til en vert. I dette tilfellet kan vi eksplisitt omgå en proxy som kan konfigureres globalt ved å bruke statisk Proxy.NO_PROXY forekomst. Under dekslene konstruerer API en ny forekomst av Fullmektig for oss, bruker Proxy.Type.DIRECT som typen:

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

I utgangspunktet, hvis det ikke er noen globalt konfigurert proxy, er dette det samme som å ringe openConnection () uten argumenter.

4.3. Bruke en SOCKS-proxy

Å bruke en SOCKS-proxy er lik HTTP-varianten når du arbeider med URLtilkobling. Vi starter med innpakning a SocketAddress eksempel med en Fullmektig bruker en type Proxy.Type.SOCKS. Etterpå passerer vi Fullmektig eksempel til URLConnection.openConnection:

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

Det er også mulig å bruk en SOCKS-proxy når du kobler til en TCP-kontakt. Først bruker vi Fullmektig eksempel for å konstruere en Stikkontakt. Etterpå, vi passere destinasjonen SocketAddress eksempel til Socket.connect ():

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

5. Konklusjon

I denne artikkelen så vi på hvordan vi kan jobbe med proxy-servere i kjernen i Java.

Først så vi på den eldre, mer globale stilen for tilkobling via proxy-servere ved hjelp av systemegenskaper. Så så vi hvordan du bruker Fullmektig klasse, som gir finkornet kontroll når du kobler til via proxy-servere.

Som alltid kan all kildekode som brukes i denne artikkelen finnes på GitHub.


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