Remplacement de l'authenticator par un setRequestProperty en java
Par Grouillot le mercredi, 23 décembre 2009, 18:45 - Programmation - Lien permanent
Au boulot en ce moment, je développe un batch java permettant de vérifier la disponibilité des sites intranet. Grosso-modo le principe est le suivant, pour chaque site web à tester le batch ouvre une connexion et teste si il n'y a pas d'erreur et éventuellement si le contenu est ressemble à celui qui est attendu.
Jusque là, tout va bien, le batch utilise la classe Authenticator pour se connecter aux sites web qui requièrent une authentification. C'est correct lorsque l'on ouvre une URL à la fois, mais ça se complique si l'on veux vérifier la disponibilité de plusieurs sites en parallèle (avec authentification différente).
L'authenticator par défaut est écrasé dans chaque thread et il arrive que le thread X utilise l'authenticator définit pour le thread Y ... pas cool, cela m'a valu une séance d'arrachage de cheveux pour comprendre le souci. Il y a une astuce pour contourner ce problème. Il faut remplacer l'authenticator par un setRequestProperty afin que chaque appli utilise l'authentification qui lui est associée.
Dans mon cas, il s'agit uniquement de définir correctement la request property "Authorization" ... le principe reste le même si il s'agit de la property "Proxy-Authorization"...
Voici comment j'ai résolu mon problème :
Code avant :
URL url = new URL ("http://mon url"); Authenticator.setDefault(monAuthenticator); HttpURLConnection cnx = (HttpURLConnection) url.openConnection();
Code après :
URL url = new URL ("http://mon url"); HttpURLConnection cnx = (HttpURLConnection) url.openConnection(); cnx.setRequestProperty("Authorization" , getBasic("mon login","mon password"));
et
private String getBasic(String user, String password) { String authBasic = "Basic "; try { String userpass = user + ":" + password; authBasic += new sun.misc.BASE64Encoder() .encode(userpass.getBytes()); } catch(Exception e) { e.printStackTrace(); } return authBasic; }
Ce code n'est peut être pas la manière la plus élégante de régler le problème, mais au moins il corrige ce problème de mélange d'authenticator.