Comment définir le mandataire à 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 a besoin de télécharger son schéma.

je suis derrière un serveur proxy. Comment configurer mon JVM pour utiliser le proxy ?

251
demandé sur Leonel 2008-09-23 16:53:25

20 réponses

à Partir de la documentation de Java ( pas la javadoc de l'API):

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

mettez les drapeaux JVM http.proxyHost et http.proxyPort lorsque vous démarrez votre JVM sur la ligne de commande. Cela se fait généralement dans un script shell (sous Unix) ou dans 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 est d'éditer les scripts de démarrage fournis par le vendeur.

de nombreux développeurs sont familiers avec 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 /


Maj: Si vous ne voulez pas utiliser proxy pour résoudre certains serveurs locaux / intranet, consultez le commentaire de @Tomalak:

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

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

pour utiliser la configuration du système proxy:

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

, Ou par programmation:

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

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

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

75
répondu Chris Carruthers 2008-09-26 00:50:42

vous pouvez programmer ces drapeaux 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","");
}

il suffit de retourner les bonnes valeurs des méthodes needsProxy() , getProxyHost() et getProxyPort() et vous pouvez appeler ce code snippet quand vous voulez.

40
répondu GHad 2018-01-30 16:19:57

JVM utilise le proxy de faire appel 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
répondu sarath 2015-01-13 09:49:26

vous pouvez définir quelques propriétés sur le serveur mandataire comme 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 dans 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 cette réponse: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E

11
répondu 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 DTDs sur internet, vous construisez une application lente, bavarde et fragile. Que se passe-t-il lorsque le serveur distant hébergeant le fichier prend un temps d'arrêt prévu ou imprévu? Votre application pauses. Est-ce correct?

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

Les URLs

pour les schémas et autres sont considérées comme des identificateurs uniques. Pas de demandes pour accéder à ce fichier à distance. Faites une recherche google sur "XML catalog". Un catalogue XML vous permet d'héberger ces ressources localement, en résolvant la lenteur, la facilité et la fragilité.

c'est essentiellement une copie mise en cache permanente de la télécommande contenu. Et C'est OK, puisque le contenu distant ne changera jamais. S'il y a une mise à jour, ce sera à une URL différente. L'extraction de la ressource sur internet surtout stupide.

8
répondu John M 2008-09-23 17:09:09

je suis aussi derrière firewall, ça a marché 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
répondu Pallavi 2017-01-17 12:59:37

Combinant du Trieur et javabrett/Leonel réponses:

java -Dhttp.proxyHost=10.10.10.10 -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password -jar myJar.jar
6
répondu 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
répondu Sorter 2012-11-01 13:10:32

ce qui suit montre comment définir en Java un proxy avec proxy user et proxy password à partir de la ligne de commande, ce qui est un cas très courant. Vous ne devez pas enregistrer les mots de passe et les hôtes dans le code, en règle générale en premier lieu.

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

mais notez ce

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 le suivant 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 utiliser https.proxyHost, https.proxyPort etc.

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

5
répondu 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 programmation plutôt que par le biais de propriétés système. Cela peut être utile si:

  1. Proxy doit être dynamique tourné au cours du programme d'exécution
  2. plusieurs mandataires parallèles doivent être utilisés
  3. Ou tout simplement rendre votre code plus propre :)

voici un exemple artificiel de 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()
}

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

4
répondu Philip M. 2015-10-01 22:34:41

récemment, j'ai découvert la façon de permettre à JVM d'utiliser les paramètres proxy de navigateur. Ce que vous devez faire est d'ajouter ${java.home}/lib/deploy.jar à votre projet et à l'initialisation de 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 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 résoudre cette limitation, laissez-moi savoir.

3
répondu dma_k 2010-03-09 14:18:11

ça marche 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 m'appuie sur la réponse de GHad.

3
répondu Viet Tran 2016-06-15 05:11:50

si vous voulez" Socks Proxy", informez les arguments vm" socksProxyHost "et" socksProxyPort".

p.ex.

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

comme il est souligné dans d'autres réponses, si vous avez besoin d'utiliser des mandataires authentifiés, il n'y a pas de façon fiable de le faire en utilisant purement des variables de ligne de commande-ce qui est ennuyeux si vous utilisez l'application de quelqu'un d'autre et ne veulent pas faire de dégâts avec le code source.

Will Iverson fait la suggestion utile à en utilisant HttpProxy pour se connecter à un hôte avec une authentification pré-émtive pour utiliser un outil de gestion par procuration comme 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 à blanc dans ce cas, par exemple passer dans -Dhttp.proxyHost= -Dhttp.proxyPort= à vos commandes java.

1
répondu patdevelop 2017-05-23 12:34:53

aussi, si vous cherchez toujours à télécharger le même schéma, alors vous pouvez ajouter le schéma à votre classepath( système de fichiers ou JAR), puis utiliser un personnalisé EntityResolver

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

Edit: See @me.yahoo.com/a/0QMxE 's discussion de CatalogResolver, qui utilise L'approche EntityResolver:

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

vous pouvez utiliser le http.variables proxy* JVM si vous êtes dans une JVM autonome mais que vous ne devriez pas modifier leurs scripts de démarrage et/ou le faire dans votre serveur d'application (sauf peut-être jboss ou tomcat). Vous devriez plutôt utiliser L'API Proxy JAVA (et non le système.setProperty) ou utiliser les propres options de configuration du fournisseur. WebSphere et WebLogic ont tous deux des façons très précises de configurer les mandataires qui sont beaucoup plus puissants que le J2SE one. En outre, pour WebSphere et WebLogic vous allez probablement casser votre serveur d'application de petites façons en écrasant les scripts de démarrage (en particulier les processus interop du serveur comme vous pourriez leur dire d'utiliser votre proxy aussi bien...).

0
répondu 2010-02-23 19:46:31

je pense que configurer WINHTTP fonctionnera aussi.

de nombreux programmes, y compris les mises à jour de Windows ont des problèmes derrière proxy. En mettant en place WINHTTP sera toujours corriger ce genre de problèmes

-3
répondu nylas 2011-11-03 20:48:10