Question Comment définir le proxy à utiliser par la JVM?


Souvent, une application Java doit se connecter à Internet. L'exemple le plus courant se produit lorsqu'il lit un fichier XML et qu'il doit télécharger son schéma.

Je suis derrière un serveur proxy. Comment configurer ma JVM pour utiliser le proxy?


248
2017-09-23 12:53


origine


Réponses:


De la documentation Java (ne pas l'API javadoc):

http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

Définir les drapeaux JVM http.proxyHost et http.proxyPort lors du démarrage de votre JVM sur la ligne de commande. Cela se fait généralement dans un script shell (sous Unix) ou un fichier bat (sous Windows). Voici l'exemple avec le script shell Unix:

JAVA_FLAGS=-Dhttp.proxyHost=10.0.0.100 -Dhttp.proxyPort=8800
java ${JAVA_FLAGS} ...

Lors de l'utilisation de conteneurs tels que JBoss ou WebLogic, ma solution consiste à éditer les scripts de démarrage fournis par le fournisseur.

De nombreux développeurs sont familiers avec l'API Java (javadocs), mais le reste de la documentation est souvent ignorée. Il contient beaucoup d'informations intéressantes: http://download.oracle.com/javase/6/docs/technotes/guides/


Mettre à jour : Si vous ne souhaitez pas utiliser de proxy pour résoudre certains hôtes locaux / intranet, consultez le commentaire de @Tomalak:

N'oubliez pas non plus la propriété http.nonProxyHosts!

-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com‌​|etc"

292
2017-09-23 12:54



Pour utiliser la configuration du proxy système:

java -Djava.net.useSystemProxies=true ...

Ou par programme:

System.setProperty("java.net.useSystemProxies", "true");

La source: http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html


76
2017-07-17 17:13



Pour définir un proxy HTTP / HTTPS et / ou SOCKS par programme:

...

public void setProxy() {
    if (isUseHTTPProxy()) {
        // HTTP/HTTPS Proxy
        System.setProperty("http.proxyHost", getHTTPHost());
        System.setProperty("http.proxyPort", getHTTPPort());
        System.setProperty("https.proxyHost", getHTTPHost());
        System.setProperty("https.proxyPort", getHTTPPort());
        if (isUseHTTPAuth()) {
            String encoded = new String(Base64.encodeBase64((getHTTPUsername() + ":" + getHTTPPassword()).getBytes()));
            con.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
            Authenticator.setDefault(new ProxyAuth(getHTTPUsername(), getHTTPPassword()));
        }
    }
    if (isUseSOCKSProxy()) {
        // SOCKS Proxy
        System.setProperty("socksProxyHost", getSOCKSHost());
        System.setProperty("socksProxyPort", getSOCKSPort());
        if (isUseSOCKSAuth()) {
            System.setProperty("java.net.socks.username", getSOCKSUsername());
            System.setProperty("java.net.socks.password", getSOCKSPassword());
            Authenticator.setDefault(new ProxyAuth(getSOCKSUsername(), getSOCKSPassword()));
        }
    }
}

...

public class ProxyAuth extends Authenticator {
    private PasswordAuthentication auth;

    private ProxyAuth(String user, String password) {
        auth = new PasswordAuthentication(user, password == null ? new char[]{} : password.toCharArray());
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return auth;
    }
}

...

Rappelez-vous que les proxies HTTP et les proxy SOCKS fonctionnent à différents niveaux dans la pile réseau, vous pouvez donc utiliser l'un ou l'autre ou les deux.


74
2017-09-26 00:50



Vous pouvez définir ces indicateurs de la manière suivante:

if (needsProxy()) {
    System.setProperty("http.proxyHost",getProxyHost());
    System.setProperty("http.proxyPort",getProxyPort());
} else {
    System.setProperty("http.proxyHost","");
    System.setProperty("http.proxyPort","");
}

Il suffit de retourner les bonnes valeurs des méthodes needsProxy(), getProxyHost() et getProxyPort() et vous pouvez appeler cet extrait de code quand vous le voulez.


40
2017-09-23 12:57



Vous pouvez définir certaines propriétés du serveur proxy en tant que paramètres jvm

-Dhttp.proxyPort = 8080, proxyHost, etc.

mais si vous avez besoin de passer par un proxy d'authentification, vous avez besoin d'un authentificateur comme celui-ci:

ProxyAuthenticator.java

import java.net.*;
import java.io.*;

public class ProxyAuthenticator extends Authenticator {

    private String userName, password;

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password.toCharArray());
    }

    public ProxyAuthenticator(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }
}

Example.java

    import java.net.Authenticator;
    import ProxyAuthenticator;

public class Example {

    public static void main(String[] args) {
        String username = System.getProperty("proxy.authentication.username");
        String password = System.getProperty("proxy.authentication.password");

                if (username != null && !username.equals("")) {
            Authenticator.setDefault(new ProxyAuthenticator(username, password));
        }

                // here your JVM will be authenticated

    }
}

Sur la base de cette réponse: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E


11
2017-09-23 17:48



JVM utilise le proxy pour effectuer des appels HTTP

System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");

Cela peut utiliser le proxy de définition de l'utilisateur

System.setProperty("java.net.useSystemProxies", "true");

11
2018-01-13 09:49



lire un fichier XML et doit télécharger son schéma

Si vous comptez récupérer des schémas ou des DTD sur Internet, vous créez une application lente, bavarde et fragile. Que se passe-t-il lorsque le serveur distant hébergeant le fichier prend des temps d'arrêt planifiés ou imprévus? Votre application se casse Est-ce que c'est OK?

Voir http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files

Les URL des schémas et autres sont mieux considérés comme des identifiants uniques. Pas en tant que demandes d'accès réel à ce fichier à distance. Faites un peu de recherche google sur "catalogue XML". Un catalogue XML vous permet d'héberger de telles ressources localement, en résolvant la lenteur, le bavardage et la fragilité.

Il s'agit essentiellement d'une copie en cache permanente du contenu distant. Et c'est OK, puisque le contenu distant ne changera jamais. S'il y a une mise à jour, ce sera à une URL différente. Rendre la récupération réelle de la ressource sur Internet particulièrement stupide.


8
2017-09-23 17:09



Met le java.net.useSystemProxies propriété à true. Vous pouvez le définir, par exemple, à JAVA_TOOL_OPTIONS variable environnementale. Dans Ubuntu, vous pouvez, par exemple, ajouter la ligne suivante à .bashrc:

export JAVA_TOOL_OPTIONS + = "-Djava.net.useSystemProxies = true"


7
2017-09-10 21:25



Je suis aussi derrière le pare-feu, cela a fonctionné pour moi !!

System.setProperty("http.proxyHost", "proxy host addr");
System.setProperty("http.proxyPort", "808");
Authenticator.setDefault(new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication("domain\\user","password".toCharArray());
    }
});

URL url = new URL("http://www.google.com/");
URLConnection con = url.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(
                    con.getInputStream()));

// Read it ...
String inputLine;
while ((inputLine = in.readLine()) != null)
    System.out.println(inputLine);

in.close();

7
2017-09-06 07:37