Connessione tramite server proxy in Core Java

1. Introduzione

I server proxy fungono da intermediari tra le applicazioni client e altri server. In un contesto aziendale, li usiamo spesso per fornire il controllo sui contenuti che gli utenti consumano, solitamente oltre i confini della rete.

In questo tutorial, vedremo come connettersi tramite server proxy in Java .

Innanzitutto, esploreremo l'approccio più vecchio e più globale che è a livello di JVM e configurato con le proprietà di sistema. Successivamente, introdurremo la classe Proxy , che ci offre un maggiore controllo consentendo la configurazione in base alla connessione.

2. Configurazione

Per eseguire gli esempi in questo articolo, avremo bisogno di accedere a un server proxy. Squid è un'implementazione popolare disponibile per la maggior parte dei sistemi operativi. La configurazione predefinita di Squid sarà abbastanza buona per la maggior parte dei nostri esempi.

3. Utilizzo di un'impostazione globale

Java espone una serie di proprietà di sistema che possono essere utilizzate per configurare il comportamento a livello di JVM. Questo approccio "taglia unica" è spesso il più semplice da implementare se è appropriato per il caso d'uso.

Possiamo impostare le proprietà richieste dalla riga di comando quando si richiama la JVM . In alternativa, possiamo anche impostarli chiamando System.setProperty () in fase di esecuzione .

3.1. Proprietà di sistema disponibili

Java fornisce gestori proxy per i protocolli HTTP, HTTPS, FTP e SOCKS. Un proxy può essere definito per ogni gestore come nome host e numero di porta:

  • http.proxyHost - Il nome host del server proxy HTTP
  • http.proxyPort - Il numero di porta del server proxy HTTP - la proprietà è facoltativa e il valore predefinito è 80 se non fornito
  • http.nonProxyHosts - Un elenco delimitato da barre verticali ("|") di modelli host per i quali il proxy deve essere ignorato - si applica sia ai gestori HTTP che HTTPS, se impostati
  • socksProxyHost - Il nome host del server proxy SOCKS
  • socksProxyPort - Il numero di porta del server proxy SOCKS

Se si specifica nonProxyHosts , i modelli host possono iniziare o terminare con un carattere jolly ("*"). Potrebbe essere necessario sfuggire al "|" delimitatore su piattaforme Windows. Un elenco completo di tutte le proprietà di sistema relative al proxy disponibili è disponibile nella documentazione Java ufficiale di Oracle sulle proprietà di rete.

3.2. Impostato tramite gli argomenti della riga di comando

Possiamo definire proxy sulla riga di comando passando le impostazioni come proprietà di sistema:

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

Quando si avvia un processo in questo modo, siamo in grado di utilizzare semplicemente OpenConnection () sul URL senza alcun lavoro supplementare:

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

3.3. Imposta utilizzando System.setProperty (String, String)

Se non siamo in grado di impostare le proprietà del proxy sulla riga di comando, possiamo impostarle con le chiamate a System.setProperty () all'interno del nostro programma:

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

Se in seguito disimpostiamo manualmente le proprietà di sistema rilevanti, il proxy non verrà più utilizzato:

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

3.4. Limitazioni della configurazione globale

Sebbene l'utilizzo di una configurazione globale con proprietà di sistema sia facile da implementare, questo approccio limita ciò che possiamo fare perché le impostazioni si applicano all'intera JVM . Per questo motivo, le impostazioni definite per un particolare protocollo sono attive per la durata della JVM o finché non vengono annullate.

Per aggirare questa limitazione, potresti essere tentato di attivare e disattivare le impostazioni secondo necessità. Per eseguire questa operazione in modo sicuro in un programma multi-thread, sarebbe necessario introdurre misure per proteggere dai problemi di concorrenza.

In alternativa, l'API proxy fornisce un controllo più granulare sulla configurazione del proxy.

4. Utilizzo dell'API proxy

La classe Proxy ci offre un modo flessibile per configurare i proxy in base alla connessione. Se sono presenti impostazioni proxy a livello di JVM esistenti, le impostazioni proxy basate sulla connessione che utilizzano la classe Proxy le sovrascriveranno.

Esistono tre tipi di proxy che possiamo definire tramite Proxy .

  • HTTP : un proxy che utilizza il protocollo HTTP
  • SOCKS - un proxy che utilizza il protocollo SOCKS
  • DIRETTO : una connessione diretta configurata in modo esplicito senza proxy

4.1. Utilizzo di un proxy HTTP

Per utilizzare un proxy HTTP, prima avvolgiamo un'istanza SocketAddress con un Proxy e un tipo di Proxy.Type.HTTP . Successivamente, passiamo semplicemente l' istanza Proxy a 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);

In poche parole, ciò significa che ci collegheremo a URL_STRING , ma poi instraderemo quella connessione attraverso un server proxy ospitato su 127.0.0.1:3128 .

4.2. Utilizzo di un proxy DIRETTO

Potrebbe essere necessario connettersi direttamente a un host. In questo caso, possiamo bypassare esplicitamente un proxy che può essere configurato a livello globale utilizzando l' istanza statica Proxy.NO_PROXY . Dietro le quinte , l'API costruisce una nuova istanza di Proxy per noi, utilizzando Proxy.Type.DIRECT come tipo :

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

Fondamentalmente, se non esiste un proxy configurato a livello globale, è come chiamare openConnection () senza argomenti.

4.3. Utilizzo di un proxy SOCKS

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.

Per prima cosa, abbiamo esaminato il vecchio stile più globale di connessione tramite server proxy utilizzando le proprietà di sistema. Quindi, abbiamo visto come utilizzare la classe Proxy , che fornisce un controllo granulare durante la connessione tramite server proxy.

Come sempre, tutto il codice sorgente utilizzato in questo articolo può essere trovato su GitHub.