Bonjour,

Je développe une appli J2EE qui est déployée sur un serveur JBoss4.2.3. Cette appli demande une authentification (login/password).
Mais j'ai aussi un programme client qui doit envoyer des fichiers vers mon appli pour qu'elle les traite, sans s'authentifier.

J'ai conçu une servlet qui ne demande pas d'authetification particulière et j'ai fait l'envoi des fichiers en faisant le post d'un form, en utilisant le package org.apache.http :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
FileBody bin = new FileBody(new File(filePath), "application/octet-stream");
reqEntity.addPart(fileId, bin);
HttpPost httppost = new HttpPost(url);
httppost.setEntity(reqEntity);
 
HttpClient httpclient = DefaultHttpClient();
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();

(fileId est un identifiant unique)

Ça marche bien en HTTP. Mais on l'a demandé que ça fonctionne en HTTPS.
J'ai regardé sur le net, et j'ai trouvé cette solution pour l'initialisation du HttpClient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[] { new MyTrustManager() }, new SecureRandom());
SSLSocketFactory sf = new SSLSocketFactory(sslContext);
Scheme httpsScheme = new Scheme("https", 443, sf);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(httpsScheme);
ClientConnectionManager cm = new BasicClientConnectionManager(schemeRegistry);
HttpClient httpClient = new DefaultHttpClient(cm);

avec MyTrustManager qui accepte tous les certificats(d'après ce que j'ai pu comprendre...):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
public class MyTrustManager implements X509TrustManager{
 
	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
	}
 
	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
	}
 
	public X509Certificate[] getAcceptedIssuers() {
		return null;
	}
}
Le problème c'est que cette solution ne marche pas. Les paramètres sont bien transmis à la servlet mais pas le contenu du fichier.

Est-ce que quelqu'un pourrait me dire ce qui ne va pas dans ce code? Ou me donner un autre moyen de faire ce transfert?
J'avais pensé à transférer les fichiers par FTP et appeler ensuite ma servlet mais ça ferait 2 étapes, pas forcément synchronisées, non?

Merci!

Fabien