La communication Java échoue via un proxy Web à l'aide d'Apache HttpClient


J'ai un client de bureau qui envoie des données à un serveur Web et je n'arrive pas à passer par le serveur proxy.

Update: Je reçois une erreur HTTP 407 en essayant de communiquer via le proxy.

Lors du téléchargement d'informations depuis mon serveur Web, tout va bien. Une fois que l'utilisateur a configuré le serveur proxy (à l'aide d'une boîte de dialogue que j'ai écrite), le téléchargement fonctionne correctement. Mais télécharger des données en utilisant org.Apache.http.client.HttpClient ne fonctionne pas.

Je configure le serveur proxy avec du code comme celui-ci après avoir recueilli les informations d'un JDialog.

        System.setProperty("http.proxyHost", proxyHost);
        System.setProperty("http.proxyPort", "" + portNumber);

Maintenant, une fois que nous faisons cela, les téléchargements simples fonctionnent bien. Par exemple, j'ai du code qui lit certaines données XML de mon serveur Web (voir ci-dessous). Sur le réseau du client, l'erreur dans mon bloc catch s'affichait avant la configuration des paramètres du proxy, puis tout fonctionnait correctement une fois le proxy correct défini.

/**
 * Loads a collection of exams from the web site. The URL is determined by
 * configuration or registration since it is State specific.
 */
public static int importExamsWS(StringBuilder msg) {
    try {
        java.net.URL onlineExams = new URL(examURL);
        //Parse the XML data from InputStream and store it.
        return importExams(onlineExams.openStream(), msg);

    } 
    catch (java.net.UnknownHostException noDNS) {
        showError(noDNS, "Unable to connect to proctinator.com to download the exam file.\n"
                + "There is probably a problem with your Internet proxy settings.");
    }
    catch (MalformedURLException | IOException duh) {
        showFileError(duh);
    }
    return 0;
}

Cependant, lorsque j'essaie d'ENVOYER des données au serveur Web c'est comme si les paramètres du proxy étaient ignorés et qu'une IOException était levée. À savoir:

org.apache.http.conn.HttpHostConnectException: Connection to http://proctinator.com:8080 refused

Maintenant, je sais que le port 8080 n'est pas bloqué par le filtre Web du client car nous avons testé l'adresse dans un navigateur Web.

Voici mon code pour vérifier l'ID d'enregistrement entré par l'utilisateur: Mise à jour: Maintenant, je définis également le proxy dans cette méthode.

//Registered is just an enum with ACTIVE, INACTIVE, NOTFOUND, ERROR
public static Registered checkRegistration(int id) throws IOException {    
    httpclient = new DefaultHttpClient();
    Config pref = Config.getConfig(); //stores user-entered proxy settings.
    HttpHost proxy = new HttpHost(pref.getProxyServer(), pref.getProxyPort());
    httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
    URIBuilder builder = new URIBuilder();
    String path = "/Proctorest/rsc/register/" + id;
    try {
        builder.setScheme("http").setHost(server).setPort(8080).setPath(path);
        URI uri = builder.build();
        System.out.println("Connecting to " + uri.toString());
        HttpGet httpget = new HttpGet(uri);
        HttpResponse response = httpclient.execute(httpget);
        System.out.println(response.getStatusLine().toString());
        if(response.getStatusLine().getStatusCode()==200) {
            String msg = EntityUtils.toString(response.getEntity());
            GUI.globalLog.log(Level.INFO, "Server response to checkRegistration(" + id + "): " + msg);
            return Registered.stringToRegistered(msg);
        }
        else {
            GUI.globalLog.log(Level.INFO, "Server response status code to checkRegistration: " + 
                    response.getStatusLine().getStatusCode());
            return Registered.ERROR;
        }
    }
    catch(java.net.URISyntaxException bad) {
        System.out.println("URI construction error: " + bad.toString());
        return Registered.ERROR;
    }
}

Je suis presque certain que le problème vient de la configuration du serveur proxy, mais le les documents pour SystemDefaultHttpClient affirment qu'il utilise les propriétés système pour http.proxyHost et http.proxyPort. Je sais que les propriétés ont été correctement définies, mais je reçois toujours cette erreur d'authentification. L'affichage des journaux générés à partir de mon programme m'a montré ceci:

checkRegistration INFO: Server response status code to checkRegistration: 407 

Comment résoudre cette erreur d'authentification?

Author: Thorn, 2012-06-28

3 answers

Je vais essayer. Si le serveur proxy utilise l'authentification de base, vous pouvez utiliser l'extrait de code suivant comme exemple:

DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getCredentialsProvider().setCredentials(
    new AuthScope("PROXY HOST", 8080),
    new UsernamePasswordCredentials("username", "password"));

HttpHost targetHost = new HttpHost("TARGET HOST", 443, "https");
HttpHost proxy = new HttpHost("PROXY HOST", 8080);

httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 

Si le serveur proxy utilise l'authentification NTLM, je ne crois pas que le support NTLM soit disponible pour toutes les versions du serveur proxy (cela fonctionnera avec certaines versions du serveur proxy d'authentification NTLM - vérifiez si le proxy utilise v1 ou v2 de l'authentification NTLM). Pour la référence et les solutions de contournement, vous pouvez vérifier suivant:

Http://hc.apache.org/httpcomponents-client-ga/ntlm.html

Http://htmlunit.sourceforge.net/ntlm.html

Http://devsac.blogspot.com/2010/10/supoprt-for-ntlmv2-with-apache.html

En fonction de votre serveur proxy, vous devrez peut-être rechercher NTCredentials au lieu de UserPasswordCredentials.

Je suggère également que vous souhaitiez peut-être envisager d'utiliser wireshark pour capturer des paquets réseau et vérifier la réponse du serveur proxy pour être absolument sûr de ce qui cause le problème.

 5
Author: ali haider, 2012-07-08 23:14:13

Juste pour être complet, puisque cette question se trouve à la recherche de http JVM.les propriétés du proxy, si vous utilisez l'infrastructure JVM, le nom d'utilisateur et les mots de passe du proxy peuvent être fournis en utilisant:

System.setProperty("http.proxyUser",proxyUserName)
System.setProperty("http.proxyPassword",proxyUsePassword).
 1
Author: Simone Gianni, 2012-07-11 17:08:59

Pour une raison quelconque, la définition de paramètres sur le client n'a pas fonctionné pour moi.

Mais a travaillé sur la méthode http.

 0
Author: Pradeep, 2014-03-07 15:41:17