Comment faire en sorte que HttpURLConnection utilise un proxy?

136

Si je fais ça ...

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

il imprime

Proxy? false

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

izb
la source

Réponses:

336

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

//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 nécessite 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);
NickDK
la source
7
pouvons-nous fournir un nom d'utilisateur et un mot de passe proxy via celui-ci.
Xolve
15
Que faire si vous avez différentes paires nom d'utilisateur / mot de passe pour les différents proxys? L'appel d'une méthode statique pour définir l'authentificateur par défaut n'est pas idéal, ce n'est pas beaucoup mieux que de définir la méthode des propriétés sys ..
javaPhobic
2
Authenticator.default est une variable statique (c'est-à-dire globale), donc ce n'est qu'une seule fois. Mais veuillez noter que l'authentificateur ci-dessus n'est qu'un exemple minimal. Il ne peut gérer qu'un seul mot de passe à la fois. Google pour des exemples qui peuvent gérer plusieurs hôtes avec des mots de passe différents.
Stroboskop
3
Depuis 8u11, cela ne fonctionnera pas par défaut avec l'authentification de base, oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabled La propriété système des schémas doit être définie sur vide
blanc
3
Au cas où vous auriez un domaine. Procédez comme suit:new PasswordAuthentication("domainName\\user", "password".toCharArray());
Développeur Marius Žilėnas
34

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

Sean Owen
la source
19

Les proxys sont pris en charge via deux propriétés système: http.proxyHost et http.proxyPort. Ils doivent être définis respectivement sur le serveur proxy et le port. L'exemple de base suivant 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);
Pascal Thivent
la source
@Pascal Savez-vous quelles sont les principales différences entre l'utilisation de la dernière approche Java et Apache commons-httpclient? Comme Java prend en charge le proxy et l'authentification (comme vous l'avez mentionné ici stackoverflow.com/questions/1626549/… ), pour des cas simples (comme récupérer un fichier sur un serveur HTTP public), il n'y a aucune raison d'utiliser la bibliothèque Apache. Quelle est votre recommandation?
dma_k
@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.
Pascal Thivent
Savez-vous comment prendre en charge les nonProxyHosts? Je vois que mon appareil le prend en charge mais ne sait pas comment faire en sorte que mon application le gère.
RiRomain
Mais la variable systemPropertiesn'est pas utilisée par le connection!
parsecer
12

Vous pouvez également définir

-Djava.net.useSystemProxies=true

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

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

Daniel Worthington-Bodart
la source
6
Cela fonctionne uniquement avec la configuration manuelle du serveur proxy. La configuration automatique du proxy et les proxies configurés via le script ne sont pas (encore) propagés à "useSystemProxies".
Pneus
1
Cela a fonctionné pour moi lors de la configuration de proxyHost et proxyPort. Merci!
nrobey
De même, cela a fonctionné derrière ma procuration de la société lorsque les appels à System.setPropertyla https.proxyHostet https.proxyPortpour une raison quelconque ne sont pas la moutarde réduisent.
Pavel Komarov
10

Définissez ce qui suit avant d'ouvrir la connexion,

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

Si le proxy nécessite une authentification,

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");
Codeur ZZ
la source
7
Je pense en fait que "http.proxyUser" et "http.proxyPassword" ne sont plus supportés. Voir stackoverflow.com/questions/120797/… pour plus de détails.
p3t0r
5

Pour Java 1.8 et supérieur, vous devez définir la -Djdk.http.auth.tunneling.disabledSchemes=création de proxys avec une autorisation de base fonctionnant avec https.

Anton
la source
1
Des informations générales à ce sujet sont
présentées
2

La réponse approuvée fonctionnera ... si vous connaissez votre hôte proxy et votre port =). Mais si vous recherchez l'hôte proxy et le port, les étapes ci-dessous devraient vous aider

si un proxy configuré automatiquement est donné: alors

1> ouvrez IE (ou n'importe quel navigateur)

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

3> ouvrez le fichier .pac dans le pavé de texte, identifiez PROXY:

Dans votre éditeur, cela viendra quelque chose comme:

renvoyer "PROXY web-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080";

bravo à bekur de maven dans 5 min ne fonctionne pas

Une fois que vous avez l'hôte et le port, entrez simplement dans ceci et vous êtes prêt à partir

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