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 puis-je configurer ma JVM pour utiliser le proxy?
Réponses:
Depuis la documentation Java ( pas l'API javadoc):
http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html
Définissez les drapeaux JVM
http.proxyHost
ethttp.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:Lors de l'utilisation de conteneurs tels que JBoss ou WebLogic, ma solution consiste à éditer les scripts de démarrage fournis par le vendeur.
De nombreux développeurs connaissent l'API Java (javadocs), mais bien souvent le reste de la documentation est ignoré. Il contient de nombreuses informations intéressantes: http://download.oracle.com/javase/6/docs/technotes/guides/
Mise à jour: si vous ne souhaitez pas utiliser de proxy pour résoudre certains hôtes locaux / intranet, consultez le commentaire de @Tomalak:
la source
http.nonProxyHosts
propriété! (utilisation comme ceci:-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com|etc"
)http.proxyUser
ethttp.proxyPassword
ne sont pas des propriétés système Java. Ils sont destinés au client HTTP Apache.https.proxyHost
ethttps.proxyPort
pour HTTP.Pour utiliser la configuration du proxy système:
Ou par programme:
Source: http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html
la source
Pour définir un proxy HTTP / HTTPS et / ou SOCKS par programme:
N'oubliez pas 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.
la source
Vous pouvez définir ces indicateurs par programme de cette façon:
Il suffit de retourner les bonnes valeurs des méthodes
needsProxy()
,getProxyHost()
etgetProxyPort()
vous pouvez appeler cet extrait de code chaque fois que vous voulez.la source
JVM utilise le proxy pour effectuer des appels HTTP
Cela peut utiliser un proxy de configuration utilisateur
la source
System.setProperty
au lieu deSystem.getProperties().put(...)
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 devez passer par un proxy d'authentification, vous avez besoin d'un authentificateur comme cet exemple:
ProxyAuthenticator.java
Example.java
Basé sur cette réponse: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E
la source
Combiner les réponses de Sorter's et javabrett / Leonel:
la source
Définissez la
java.net.useSystemProxies
propriété surtrue
. 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
:la source
Ce qui suit montre comment définir en Java un proxy avec un utilisateur proxy et un mot de passe proxy à 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 système en ligne de commande avec -D et les définir dans le code avec System.setProperty ("nom", "valeur") est équivalent.
Mais notez ceci
Exemple qui fonctionne:
Mais ce qui suit ne fonctionne pas :
La seule différence est la position des propriétés du système! (avant et après le cours)
Si vous avez des caractères spéciaux dans le mot de passe, vous pouvez 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.la source
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 ce serveur distant hébergeant le fichier prend un temps d'arrêt planifié ou non planifié? Votre application se casse. Est-ce que ça va?
Voir http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files
Les URL des schémas et similaires sont mieux considérées comme des identifiants uniques. Pas comme des demandes d'accès à ce fichier à distance. Faites une recherche google sur "catalogue XML". Un catalogue XML vous permet d'héberger ces ressources localement, ce qui résout la lenteur, la causerie et la fragilité.
Il s'agit essentiellement d'une copie en cache permanente du contenu distant. Et c'est OK, car le contenu distant ne changera jamais. S'il y a une mise à jour, ce serait à une URL différente. Rendre la récupération réelle de la ressource sur Internet particulièrement stupide.
la source
Je suis également derrière le pare-feu, cela a fonctionné pour moi !!
la source
Si vous voulez "Socks Proxy", indiquez les arguments de la machine virtuelle "socksProxyHost" et "socksProxyPort".
par exemple
la source
Ajoutez ceci avant de vous connecter à une URL derrière un proxy.
la source
http.proxyUser
ethttp.proxyPassword
ne sont pas des propriétés du système Java. Ils sont destinés au client HTTP Apache.System.setProperty
au lieu deSystem.getProperties().put(...)
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:
Voici un exemple artificiel dans groovy:
Référence complète: http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html
la source
Récemment, j'ai découvert le moyen d'autoriser la JVM à utiliser les paramètres de proxy du navigateur. Ce que vous devez faire est d'ajouter
${java.home}/lib/deploy.jar
à votre projet et de lancer la bibliothèque comme suit:Ensuite, les paramètres du 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 exemplejava -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar
. Si quelqu'un sait comment surmonter cette limitation, faites-le moi savoir.la source
xbootclasspath
pointage sur deploy.jar aurait pour effet, ne pourrais-je pas prendre ce pot dans mon chemin de classe normal (lors de l'exécution sans webstart)?Exception in thread "main" java.lang.IllegalAccessError: class ...) cannot access class com.sun.deploy.net.proxy.DeployProxySelector (in module jdk.deploy) because module jdk.deploy does not export com.sun.deploy.net.proxy
Ça marche pour moi:
P / S: Je me base sur la réponse de GHad.
la source
Comme indiqué dans d'autres réponses, si vous devez utiliser des proxys authentifiés, il n'y a pas de moyen fiable de le faire en utilisant uniquement des variables de ligne de commande - ce qui est ennuyeux si vous utilisez l'application de quelqu'un d'autre et que vous ne voulez pas jouer avec le code source.
Will Iverson fait la suggestion utile à l' aide de HttpProxy pour se connecter à un hôte avec une authentification préventive afin d'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 mettre les valeurs proxyHost et proxyPort à blanc dans ce cas, par exemple, passez
-Dhttp.proxyHost= -Dhttp.proxyPort=
à vos commandes java.la source
Vous pouvez utiliser les variables JVM http.proxy * si vous êtes dans une JVM autonome mais vous NE DEVEZ PAS modifier leurs scripts de démarrage et / ou le faire sur votre serveur d'applications (sauf peut-être jboss ou tomcat). Au lieu de cela, vous devez utiliser l'API JAVA Proxy (pas System.setProperty) ou utiliser les propres options de configuration du fournisseur. WebSphere et WebLogic ont tous deux des façons très définies 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 ...).
la source
Je pense que la configuration de WINHTTP fonctionnera également.
De nombreux programmes, y compris les mises à jour Windows, rencontrent des problèmes derrière le proxy. La configuration de WINHTTP résoudra toujours ce genre de problèmes
la source