Connexion via des serveurs proxy dans le noyau Java

Connexion via des serveurs proxy en Core Java

1. introduction

Les serveurs proxy agissent en tant qu'intermédiaires entre les applications clientes et les autres serveurs. Dans un contexte d'entreprise, nous les utilisons souvent pour aider à contrôler le contenu consommé par les utilisateurs, généralement au-delà des limites du réseau.

Dans ce didacticiel, nous allons examinerhow to connect through proxy servers in Java.

Tout d'abord, nous allons explorer 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 classeProxy, qui nous donne plus de contrôle en autorisant la configuration sur une base par connexion.

2. Installer

Pour exécuter les exemples de cet article, nous devons 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 pouvant être utilisées pour configurer le comportement à l'échelle de la JVM. Cette approche «taille unique» est souvent la plus simple à mettre en œuvre si elle convient au cas d’utilisation.

Nous pouvonsset the required properties from the command line when invoking the JVM. Comme alternative, nous pouvons égalementset them by calling System.setProperty() at runtime.

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écifieznonProxyHosts, 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 dansOracle’s official Java documentation on networking properties.

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

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

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

Lorsque vous démarrez un processus de cette manière, nous pouvons simplement utiliseropenConnection() sur lesURL sans aucun travail supplémentaire:

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

3.3. Définir avecSystem.setProperty(String, String)

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 par la suite nous supprimons 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 approchelimits what we can do because the settings apply across the entire JVM. Pour cette raison, les paramètres définis pour un protocole particulier sont actifs pendant la vie de la machine virtuelle Java ou jusqu'à ce qu'ils soient non définis.

Pour contourner cette limitation, il peut être tentant d'activer et de désactiver les paramètres en fonction des besoins. Pour le 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 simultanéité.

Comme alternative,the Proxy API provides more granular control over proxy configuration.

4. Utilisation de l'APIProxy

La classeProxy nous offre un moyen flexible de configurer des proxys sur une base 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 classeProxy les remplaceront.

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

  • HTTP - un proxy utilisant le protocole HTTP

  • SOCKS - un proxy utilisant le protocole SOCKS

  • DIRECT - une connexion directe explicitement configurée sans proxy

4.1. Utilisation d'un proxy HTTP

Pour utiliser un proxy HTTP, nous commençons parwrap a SocketAddress instance with a Proxy and type of Proxy.Type.HTTP. Ensuite, nous passons simplement l'instanceProxy à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é chez127.0.0.1:3128.

4.2. Utilisation d'un proxy DIRECT

Nous pouvons être obligés de nous connecter directement à un hôte. Dans ce cas, nous pouvons explicitementbypass a proxy that may be configured globally by using the static Proxy.NO_PROXY instance. Sous les couvertures, l'API construit une nouvelle instance deProxy pour nous, en utilisantProxy.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 à appeleropenConnection() w sans argument.

4.3. Utilisation d'un proxy SOCKS

L'utilisation d'un proxy SOCKS est similaire à la variante HTTP lorsque vous travaillez avecURLConnection. Nous commençons parwrapping a SocketAddress instance with a Proxy using a type of Proxy.Type.SOCKS. Ensuite, nous passons l'instanceProxy àURLConnection.openConnection:

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

Il est également possible deuse a SOCKS proxy when connecting to a TCP socket. Tout d'abord, nous utilisons l'instanceProxy pour construire unSocket. Ensuite, nouspass 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

Dans cet article, nous avons étudié comment utiliser les serveurs proxy dans le noyau Java.

Premièrement, nous avons examiné le style plus ancien et plus global de connexion via des serveurs proxy utilisant les propriétés du système. Ensuite, nous avons vu comment utiliser la classeProxy, qui fournit 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 suron GitHub.