Comment définir le proxy à utiliser par la JVM


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

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

Author: Leonel, 2008-09-23

20 answers

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

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

Définissez les indicateurs 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} ...

Lorsque vous utilisez des conteneurs tels que JBoss ou WebLogic, ma solution consiste à modifier les scripts de démarrage fournis par Fournisseur.

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


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

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

-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com‌​|etc"
 296
Author: Leonel, 2016-10-10 06:10:41

Pour utiliser la configuration du proxy système:

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

Ou par programme:

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

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

 80
Author: gr5, 2014-01-28 17:44:51

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

...

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 proxys HTTP et les proxys SOCKS fonctionnent à différents niveaux dans la pile réseau, vous pouvez donc utiliser l'un ou l'autre ou les deux.

 75
Author: Chris Carruthers, 2008-09-26 00:50:42

Vous pouvez définir ces drapeaux par programme de cette façon:

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

Renvoie simplement les bonnes valeurs des méthodes needsProxy(), getProxyHost() et getProxyPort() et vous pouvez appeler cet extrait de code quand vous le souhaitez.

 40
Author: GHad, 2018-01-30 16:19:57

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 paramètre utilisateur proxy

System.setProperty("java.net.useSystemProxies", "true");
 12
Author: sarath, 2015-01-13 09:49:26

Vous pouvez définir certaines propriétés sur le 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 cet exemple:

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;
    }
}

Exemple.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

    }
}

Basé sur ceci réponse: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E

 11
Author: Alex. S., 2008-09-23 17:48:36

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 construisez une application lente, bavarde et fragile. Que se passe - t-il lorsque ce serveur distant hébergeant le fichier prend des temps d'arrêt planifiés ou imprévus? Votre application pauses. Est-ce correct?

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

Les URL pour les schémas et similaires sont les meilleures considéré comme des identifiants uniques. Pas comme des demandes pour accéder réellement à ce fichier à distance. Faites une recherche Google sur "catalogue XML". Un catalogue XML vous permet d'héberger ces ressources localement, en résolvant la lenteur, la causalité 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 serait à une URL différente. L'extraction de la ressource sur internet surtout stupide.

 8
Author: John M, 2008-09-23 17:09:09

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

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

 8
Author: Mihai Capotă, 2016-02-09 18:43:37

Je suis également derrière firewall, 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
Author: Pallavi, 2017-01-17 12:59:37

Combinant les réponses de Sorter et javabrett/Leonel:

java -Dhttp.proxyHost=10.10.10.10 -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password -jar myJar.jar
 6
Author: Bamboomy, 2017-07-12 14:12:28

Ajoutez ceci avant de vous connecter à une URL derrière un proxy.

System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");
System.getProperties().put("http.proxyUser", "someUserName");
System.getProperties().put("http.proxyPassword", "somePassword");
 5
Author: Sorter, 2012-11-01 13:10:32

Ce qui suit montre comment définir en Java un proxy avec l'utilisateur proxy et le mot de passe proxy à partir de la ligne de commande, ce qui est un cas très courant. En règle générale, vous ne devez pas enregistrer les mots de passe et les hôtes dans le code.

Passer les propriétés système en ligne de commande avec-D et les définir dans le code avec System.setProperty("nom", "valeur") est équivalent.

Mais cette remarque

Exemple qui fonctionne:

C:\temp>java -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps=proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit com.andreas.JavaNetHttpConnection

Mais ce qui suit fait ne fonctionne pas

C:\temp>java com.andreas.JavaNetHttpConnection -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps=proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit

La seule différence est la position des propriétés du système ! (avant et après la classe)

Si vous avez des caractères spéciaux dans le mot de passe, vous êtes autorisé à le mettre entre guillemets "@MyPass123%", comme dans l'exemple ci-dessus.

Si vous accédez à un service HTTPS, vous devez utiliser https.proxyHost, https.proxyPort etc.

Si vous accédez à un service HTTP, vous devez utiliser http.proxyHost, http.proxyPort etc.

 5
Author: Andreas Panagiotidis, 2017-01-26 08:53:12

Il s'agit d'une mise à jour mineure, mais depuis Java 7, les connexions proxy peuvent désormais être créées par programme plutôt que via les propriétés système. Cela peut être utile si:

  1. Le proxy doit être pivoté dynamiquement pendant l'exécution du programme
  2. Plusieurs proxys parallèles doivent être utilisés
  3. Ou tout simplement rendre votre code plus propre :)

Voici un exemple artificiel dans groovy:

// proxy configuration read from file resource under "proxyFileName"
String proxyFileName = "proxy.txt"
String proxyPort = "1234"
String url = "http://www.promised.land"
File testProxyFile = new File(proxyFileName)
URLConnection connection

if (!testProxyFile.exists()) {

    logger.debug "proxyFileName doesn't exist.  Bypassing connection via proxy."
    connection = url.toURL().openConnection()

} else {
    String proxyAddress = testProxyFile.text
    connection = url.toURL().openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyAddress, proxyPort)))
}

try {
    connection.connect()
}
catch (Exception e) {
    logger.error e.printStackTrace()
}

Complet Référence: http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html

 4
Author: Philip M., 2015-10-01 22:34:41

Récemment, j'ai découvert le moyen d'autoriser JVM à utiliser les paramètres proxy du navigateur. Ce que vous devez faire est d'ajouter ${java.home}/lib/deploy.jar à votre projet et d'initialiser la bibliothèque comme suit:

import com.sun.deploy.net.proxy.DeployProxySelector;
import com.sun.deploy.services.PlatformType;
import com.sun.deploy.services.ServiceManager;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public abstract class ExtendedProxyManager {

    private static final Log logger = LogFactory.getLog(ExtendedProxyManager.class);

    /**
     * After calling this method, proxy settings can be magically retrieved from default browser settings.
     */
    public static boolean init() {
        logger.debug("Init started");

        // Initialization code was taken from com.sun.deploy.ClientContainer:
        ServiceManager
                .setService(System.getProperty("os.name").toLowerCase().indexOf("windows") != -1 ? PlatformType.STANDALONE_TIGER_WIN32
                        : PlatformType.STANDALONE_TIGER_UNIX);

        try {
            // This will call ProxySelector.setDefault():
            DeployProxySelector.reset();
        } catch (Throwable throwable) {
            logger.error("Unable to initialize extended dynamic browser proxy settings support.", throwable);

            return false;
        }

        return true;
    }
}

Ensuite, les paramètres proxy sont disponibles pour l'API Java via java.net.ProxySelector.

Le seul problème avec cette approche est que vous devez démarrer la JVM avec deploy.jar dans bootclasspath, par exemple java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar. Si quelqu'un sait comment surmonter cette limitation, faites-le moi savoir.

 3
Author: dma_k, 2010-03-09 14:18:11

Cela fonctionne pour moi:

public void setHttpProxy(boolean isNeedProxy) {
    if (isNeedProxy) {
        System.setProperty("http.proxyHost", getProxyHost());
        System.setProperty("http.proxyPort", getProxyPort());
    } else {
        System.clearProperty("http.proxyHost");
        System.clearProperty("http.proxyPort");
    }
}

P/S: Je me base sur la réponse de GHad.

 3
Author: Viet Tran, 2016-06-15 05:11:50

Si vous voulez "Socks Proxy", informez les arguments "socksProxyHost" et "socksProxyPort" VM.

Par exemple

java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8080 org.example.Main
 2
Author: Marcelo C., 2017-11-30 22:02:05

Comme indiqué dans d'autres réponses, si vous devez utiliser des proxys authentifiés, il n'y a aucun moyen fiable de le faire uniquement en utilisant des variables de ligne de commande-ce qui est ennuyeux si vous utilisez l'application de quelqu'un d'autre et ne voulez pas jouer avec le code source.

WillversOn fait la suggestion utile sur En utilisant HttpProxy pour se connecter à un hôte avec une authentification préemtive pour utiliser un outil de gestion de proxy tel que Proxifier ( http://www.proxifier.com / pour Mac OS X et Windows) pour gérer cela.

Par exemple, avec Proxifier, vous pouvez le configurer pour intercepter uniquement les commandes java à gérer et à rediriger via son proxy (authentifié). Vous allez vouloir définir les valeurs proxyHost et proxyPort sur vide dans ce cas, par exemple passer -Dhttp.proxyHost= -Dhttp.proxyPort= à vos commandes java.

 1
Author: patdevelop, 2017-05-23 12:34:53

De plus, si vous cherchez toujours à télécharger le même schéma, vous pouvez ajouter le schéma à votre chemin de classe (système de fichiers ou JAR), puis utiliser un EntityResolver

Voir ici pour une discussion plus complète de cette approche.

Modifier: Voir @me.yahoo.com/a/0QMxE ' s discussion de CatalogResolver, qui utilise l'approche EntityResolver:

CatalogResolver cr = new CatalogResolver();
...
yourParser.setEntityResolver(cr) 
 0
Author: toolkit, 2017-05-23 12:26:35

Vous pouvez utiliser le http.proxy * variables JVM si vous êtes dans une JVM autonome mais que vous NE DEVEZ PAS modifier leurs scripts de démarrage et / ou le faire dans votre serveur d'applications (sauf peut-être jboss ou tomcat). Au lieu de cela, vous devez utiliser l'API Proxy JAVA (pas le système.setProperty) ou utiliser les propres options de configuration du fournisseur. WebSphere et WebLogic ont des moyens très définis de configurer les proxys qui sont beaucoup plus puissants que celui de J2SE. De plus, pour WebSphere et WebLogic vous casserez probablement votre serveur d'applications de petites manières en remplaçant les scripts de démarrage (en particulier les processus d'interopérabilité du serveur, car vous pourriez leur dire d'utiliser également votre proxy...).

 0
Author: , 2010-02-23 19:46:31

Je pense que la configuration de WINHTTP fonctionnera également.

De nombreux programmes, y compris les mises à jour Windows, ont des problèmes derrière proxy. En configurant WINHTTP va toujours résoudre ce genre de problèmes

 -3
Author: nylas, 2011-11-03 20:48:10