2009-09-16 5 views
102

Si je fais ça ...Comment faire pour que HttpURLConnection utilise un proxy?

conn = new URL(urlString).openConnection(); 
System.out.println("Proxy? " + conn.usingProxy()); 

imprime

Proxy? false 

Le problème est, je suis derrière un proxy. D'où la JVM obtient-elle ses informations de proxy sous Windows? Comment puis-je configurer cela? Toutes mes autres applications semblent parfaitement satisfaites de mon proxy.

Répondre

262

Depuis Java 1.5, vous pouvez également passer une instance java.net.Proxy la méthode openConnection(proxy):

//Proxy instance, proxy ip = 10.0.0.1 with port 8080 
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080)); 
conn = new URL(urlString).openConnection(proxy); 

Si votre proxy requiert une authentification, il vous donnera la réponse 407.

Dans ce cas, vous aurez besoin du code suivant:

Authenticator authenticator = new Authenticator() { 

     public PasswordAuthentication getPasswordAuthentication() { 
      return (new PasswordAuthentication("user", 
        "password".toCharArray())); 
     } 
    }; 
    Authenticator.setDefault(authenticator); 
+6

pouvons-nous fournir un nom d'utilisateur proxy et un mot de passe proxy à travers elle. – Xolve

+1

Exactement ce que je cherchais. Et pourtant, j'ai accidentellement cliqué sur downvote en copiant/collant, seulement pour le remarquer trop tard pour le défaire. Pardon. –

+9

Et si vous avez des paires nom d'utilisateur/mot de passe différentes pour les différents procurations? Appeler une méthode statique pour définir l'Authenticator par défaut n'est pas idéal, ce n'est pas mieux que de définir la méthode sys. – javaPhobic

31

Il est assez facile de répondre à partir d'Internet. Définissez les propriétés système http.proxyHost et http.proxyPort. Vous pouvez le faire avec System.setProperty(), ou à partir de la ligne de commande avec la syntaxe -D.

10

Set suivants avant de openConnection,

System.setProperty("http.proxyHost", "host"); 
System.setProperty("http.proxyPort", "port_number"); 

Si proxy requiert une authentification,

System.setProperty("http.proxyUser", "user"); 
System.setProperty("http.proxyPassword", "password"); 
+7

En fait, je pense que "http.proxyUser" et "http.proxyPassword" ne sont plus supportés. Voir http://stackoverflow.com/questions/120797/how-do-i-set-the-proxy-to-be-used-by-the-jvm pour plus de détails. – p3t0r

17

proxies sont pris en charge par deux propriétés du système: http.proxyHost et http.proxyPort. Ils doivent être définis sur le serveur proxy et le port respectivement. L'exemple de base suivante l'illustre:

String url = "http://www.google.com/", 
     proxy = "proxy.mydomain.com", 
     port = "8080"; 
URL server = new URL(url); 
Properties systemProperties = System.getProperties(); 
systemProperties.setProperty("http.proxyHost",proxy); 
systemProperties.setProperty("http.proxyPort",port); 
HttpURLConnection connection = (HttpURLConnection)server.openConnection(); 
connection.connect(); 
InputStream in = connection.getInputStream(); 
readResponse(in); 
+0

@Pascal Savez-vous quelles sont les principales différences d'utilisation de la dernière approche Java par rapport à Apache 'commons-httpclient'? Comme Java prend en charge le proxy et l'authentification (comme vous l'avez mentionné ici http://stackoverflow.com/questions/1626549/authenticated-http-proxy-with-java), pour les cas simples (comme récupérer un fichier du serveur HTTP public), il n'y a pas de raison d'utiliser la bibliothèque Apache. Quelle est votre recommandation? –

+0

@dma_k Je suis d'accord avec vous, pour des cas d'utilisation simples comme celui que vous avez décrit, je n'utiliserais pas une bibliothèque tierce. –

+0

Savez-vous comment supporter les nonProxyHosts? Je vois que mon appareil le supporte mais ne sait pas comment faire pour que mon application le gère. – RiRomain

8

Vous pouvez également définir

-Djava.net.useSystemProxies=true 

Sous Windows et Linux, cela utilisera les paramètres du système de sorte que vous n'avez pas besoin de vous répéter (DRY)

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

+5

Ceci fonctionne uniquement avec la configuration manuelle du serveur proxy. La configuration automatique du proxy et les proxys configurés via le script ne sont pas (encore) propagés à "useSystemProxies". – Tires

+0

Cela a fonctionné pour moi lors de la définition de proxyHost et proxyPort n'a pas. Merci! – nrobey

2

La réponse approuvée fonctionnera. .. si vous connaissez votre hôte proxy et le port =). Mais si vous êtes à la recherche de l'hôte proxy et le port les étapes ci-dessous devraient aider

si proxy configuré automatique est donnée: alors

1> ouvrez Internet Explorer (ou tout autre navigateur)

2> obtenir l'adresse url de votre navigateur via IE-> Outils-> Internet option-> connexions-> Paramètres LAN-> obtenir l'adresse et donner en url par exemple: comme http://autocache.abc.com/ et entrez, un fichier sera téléchargé avec format .pac , enregistrer sur le bureau

3> fichier .pac ouvert textpad, identifier PROCURATION:

Dans votre éditeur, il viendra quelque chose comme:

retour « PROCURATION web proxy.ind.abc.com:8080; PROCURATION proxy.sgp.abc.com:8080" ;

kudos à bekur de maven in 5 min not working

Une fois que vous avez l'hôte et le port pop juste dans ce et votre bon d'aller

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080)); 
     URLConnection connection = new URL(url).openConnection(proxy); 
3

Pour Java 1.8 et supérieur, vous devez définir -Djdk.http.auth.tunneling.disabledSchemes= pour faire des proxies avec l'autorisation de base fonctionnant avec https

+0

Les informations de base à ce sujet sont discutées à https://stackoverflow.com/questions/41806422/java-web-start-unable-to-tunnel-through-proxy-since-java-8-update-111 – U880D

Questions connexes