Connexion via des serveurs proxy dans Core Java

1. Introduction

Les serveurs proxy agissent comme des intermédiaires entre les applications clientes et les autres serveurs. Dans une entreprise, nous les utilisons souvent pour aider à contrôler le contenu que les utilisateurs consomment, généralement au-delà des limites du réseau.

Dans ce didacticiel, nous verrons comment se connecter via des serveurs proxy en Java .

Tout d'abord, nous explorerons l'ancienne approche plus globale, à l'échelle de la JVM et configurée avec des propriétés système. Ensuite, nous présenterons la classe Proxy , qui nous donne plus de contrôle en permettant la configuration sur une base par connexion.

2. Configuration

Pour exécuter les exemples de cet article, nous aurons besoin d'accéder à un serveur proxy. Squid est une implémentation populaire disponible pour la plupart des systèmes d'exploitation. La configuration par défaut de Squid sera suffisante pour la plupart de nos exemples.

3. Utilisation d'un paramètre global

Java expose un ensemble de propriétés système qui peuvent être utilisées pour configurer le comportement à l'échelle de la JVM. Cette «approche universelle» est souvent la plus simple à mettre en œuvre si elle est appropriée pour le cas d'utilisation.

Nous pouvons définir les propriétés requises à partir de la ligne de commande lors de l'appel de la JVM . Comme alternative, nous pouvons également les définir en appelant System.setProperty () au moment de l'exécution .

3.1. Propriétés système disponibles

Java fournit des gestionnaires de proxy pour les protocoles HTTP, HTTPS, FTP et SOCKS. Un proxy peut être défini pour chaque gestionnaire en tant que nom d'hôte et numéro de port:

  • http.proxyHost - Le nom d'hôte du serveur proxy HTTP
  • http.proxyPort - Le numéro de port du serveur proxy HTTP - la propriété est facultative et par défaut à 80 si elle n'est pas fournie
  • http.nonProxyHosts - Une liste délimitée par un tube («|») de modèles d'hôte pour lesquels le proxy doit être contourné - s'applique aux gestionnaires HTTP et HTTPS s'ils sont définis
  • socksProxyHost - Le nom d'hôte du serveur proxy SOCKS
  • socksProxyPort - Le numéro de port du serveur proxy SOCKS

Si vous spécifiez nonProxyHosts , les modèles d'hôte peuvent commencer ou se terminer par un caractère générique («*»). Il peut être nécessaire d'échapper au «|» délimiteur sur les plates-formes Windows. Une liste exhaustive de toutes les propriétés système disponibles liées au proxy peut être trouvée dans la documentation Java officielle d'Oracle sur les propriétés réseau.

3.2. Définir via des arguments de ligne de commande

Nous pouvons définir des proxies sur la ligne de commande en passant les paramètres en tant que propriétés système:

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

Lors du démarrage d'un processus de cette manière, nous pouvons simplement utiliser openConnection () sur l' URL sans aucun travail supplémentaire:

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

3.3. Définir à l'aide de System.setProperty (chaîne, chaîne)

Si nous ne pouvons pas définir les propriétés du proxy sur la ligne de commande, nous pouvons les définir avec des appels à System.setProperty () dans notre programme:

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

Si nous annulons ultérieurement manuellement les propriétés système pertinentes, le proxy ne sera plus utilisé:

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

3.4. Limitations de la configuration globale

Bien que l'utilisation d'une configuration globale avec des propriétés système soit facile à implémenter, cette approche limite ce que nous pouvons faire car les paramètres s'appliquent à l'ensemble de la JVM . Pour cette raison, les paramètres définis pour un protocole particulier sont actifs pendant toute la durée de vie de la JVM ou jusqu'à ce qu'ils ne soient pas définis.

Pour contourner cette limitation, il peut être tentant d'activer et de désactiver les paramètres si nécessaire. Pour ce faire en toute sécurité dans un programme multi-thread, il serait nécessaire d'introduire des mesures de protection contre les problèmes de concurrence.

Comme alternative, l'API Proxy fournit un contrôle plus granulaire sur la configuration du proxy.

4. Utilisation de l' API Proxy

La classe Proxy nous offre un moyen flexible de configurer des proxys par connexion. S'il existe des paramètres de proxy à l'échelle de la JVM, les paramètres de proxy basés sur la connexion utilisant la classe Proxy les remplaceront.

Il existe trois types de proxys que nous pouvons définir par Proxy.Type :

  • HTTP - un proxy utilisant le protocole HTTP
  • SOCKS - un proxy utilisant le protocole SOCKS
  • DIRECT - une connexion directe configurée explicitement sans proxy

4.1. Utilisation d'un proxy HTTP

Pour utiliser un proxy HTTP, nous enveloppons d' abord une instance de SocketAddress avec un Proxy et un type de Proxy.Type.HTTP . Ensuite, nous passons simplement l' instance Proxy à 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);

En termes simples, cela signifie que nous nous connecterons à URL_STRING , puis acheminerons cette connexion via un serveur proxy hébergé à 127.0.0.1:3128 .

4.2. Utilisation d'un proxy DIRECT

Nous pouvons avoir besoin de nous connecter directement à un hôte. Dans ce cas, nous pouvons contourner explicitement un proxy qui peut être configuré globalement à l'aide de l' instance statique Proxy.NO_PROXY . Sous les couvertures, l'API construit une nouvelle instance de Proxy pour nous, en utilisant Proxy.Type.DIRECT comme type :

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

Fondamentalement, s'il n'y a pas de proxy configuré globalement, cela revient à appeler openConnection () sans argument.

4.3. Utilisation d'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.

Tout d'abord, nous avons examiné le style plus ancien et plus global de connexion via des serveurs proxy à l'aide des propriétés système. Ensuite, nous avons vu comment utiliser la classe Proxy , qui offre un contrôle précis lors de la connexion via des serveurs proxy.

Comme toujours, tout le code source utilisé dans cet article se trouve à l'adresse over sur GitHub.