Lors du TP3 du cours INF510 (JEE), les élèves travaillant sur les machines de l’école ont rencontré des problèmes de connexion au Web Service “Dictionary” (ConnectionTimeout). Grace aux recherches dévoués de deux d’entre vous (Messieurs Roche et Allard), nous avons pu identifier le problème - qui est lié à la configuration des proxies sous Java - et proposer une discussion et une solution.
Cette discussion présente comment configurer le proxy utilisé par une JVM entière. Cela permet de resoudre notre problème de connexion à un Web Service sur l’Internet, puisque Axis, tournant dans une JVM, est soumis à la configuration de cette dernière.
Néanmoins, depuis Java 5.0 il existe de nouvelles méthodes plus fines de gérer des proxies sous Java. Celles-ci ne sont pas présentées ici parce que je ne suis pas sûr que Axis en profite … Pour plus de précisions sur ces nouvelles méthodes, consulter l’article de Sun très complèt ici.
Rappels sur les proxies
Un proxy server est un ordinateur intermédiaire placé entre l’ordinateur de l’utilisateur et l’Internet. Imposé par l’administrateur (qui en même temps pourrait désactiver tout connexion directe à l’Internet), il remplit deux rôles :
- Pare-feu, il filtre le contenu pour sécuriser le réseau locale et bloquer du contenu indésirable;
- Cache, il stocke temporairement en locale le contenu lu, pour améliorer la performance des futurs accès au même contenu.
Cela a donc nécessairement un impact sur tout programme Java qui voudrait ouvrir une connexion vers l’Internet, tel qu’une webapp qui tente de contacter un Web Service sur l’Internet: Une mauvaise configuration du proxy fera échouer les connexions sortantes.
Configurer le proxy d’une JVM
Jusqu’à Java1.4, la configuration du proxy se faisait au niveau d’une JVM, utilisant des propriétés du système définies soit dans le code, soit sur la ligne de commande au lancement de la JVM. Cette méthode fonctionne toujours dans les dernières version de Java. Les propriétés du système qui définissent la configuration du proxy sont:
- http.proxyHost: l’adresse du proxy server
- http.proxyPort: le port du proxy server (par défaut 80)
- http.nonProxyHosts: Une liste d’hôtes auxquels il faut se connecter directement, sans passer par le proxy. C’est une liste d’expressions régulières séparées par “|”.
- http.proxyUser: Compte facultatif d’authentification par le proxy.
- http.proxyPassword: Mot de passe facultatif pour authentification par le proxy.
Depuis Java 5.0+ il est également possible de tenter de récupérer la configuration du proxy définit par le système d’exploitation. Cela demande d’affecter la valeur “true” à la propriété du système nommé “java.net.useSystemProxies”. Si la configuration du S/E du proxy n’est pas disponible, la configuration définit pour la JVM est utilisée.
Exemple complèt pour l’ECE, sous Java 5.0+
Sur le réseau fixe à l’ECE, l’addresse et le port du proxy sont les: http-proxy.ece.fr:3128. Donc pour configurer le proxy correctement dans votre code, ajouter les lignes suivantes avant tout accès à Internet, y compris les Web Services:
System.setProperty(”java.net.useSystemProxies”, “true”);
System.setProperty(”http.proxyHost”, “http-proxy.ece.fr”);
System.setProperty(”http.proxyPort”, “3128″);
// code de connexion au réseau
… ou bien démarrer le JVM avec les options comme suit:
$ java -Dhttp.proxyHost=http-proxy.ece.fr \
-Dhttp.proxyPort=3128 \
-Djava.net.useSystemProxies=true \
…
Considérations Tomcat
Le serveur Tomcat tourne dans sa propre JVM, il est donc essentiel de configurer sa JVM (et ne pas celle d’eclipse) si vous voulez qu’il puisse ouvrir des connexions sortantes, par exemple vers un Web Service.
Si vous configurez les propriétés du système directement depuis votre code, cela ne pose pas de problème, puisque le code sera exécuté par la JVM de Tomcat. Par contre, si vous configurer les propriétés du système sur la ligne de commande, il faudrait ajouter les arguments au script de démarrage de Tomcat.
Détecter la configuration du proxy
Pour déboguer vos éventuelles difficultés de connexion, le petit programme ci-dessous permet d’afficher la configuration du proxy de la JVM dans laquelle il tourne. Notez que ce programme utilise les nouvelles classes Proxy et ProxySelector, introduit dans Java5.0, et ne fonctionnera donc pas sous Java 1.4-.
// imports ..
public class DetectProxy
{
public static void main(String[] args) throws Exception
{
System.setProperty("http.proxyHost", "http-proxy.ece.fr");
System.setProperty("http.proxyPort", "3128");
System.setProperty("java.net.useSystemProxies","true");
List proxyList = ProxySelector.getDefault().select(
new URI("http://www.yahoo.com/"));
for (Proxy proxy : proxyList)
{
System.out.println("Proxy type : " + proxy.type());
InetSocketAddress addr = (InetSocketAddress) proxy.address();
if (addr == null)
System.out.println("DIRECT CONXN");
else
System.out.println("Proxy hostname : " +
addr.getHostName() + ":" +
addr.getPort());
}
}
}