Come posso fare in modo che HttpURLConnection utilizzi un proxy?


136

Se lo faccio ...

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

stampa

Proxy? false

Il problema è che sono dietro un proxy. Da dove la JVM ottiene le sue informazioni proxy da Windows? Come lo installo? Tutte le altre mie app sembrano perfettamente soddisfatte del mio proxy.

Risposte:


336

Da java 1.5 puoi anche passare un'istanza java.net.Proxy al openConnection(proxy)metodo:

//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);

Se il tuo proxy richiede l'autenticazione ti darà risposta 407.

In questo caso avrai bisogno del seguente codice:

    Authenticator authenticator = new Authenticator() {

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

7
possiamo fornire nome utente proxy e password proxy tramite esso.
Xolve,

15
Che cosa succede se si hanno coppie di nome utente / password diverse per i diversi proxy? Chiamare un metodo statico per impostare l'Autenticatore predefinito non è l'ideale, questo non è molto meglio che impostare il metodo delle proprietà sys.
javaPhobic

2
Authenticator.default è una variabile statica (cioè globale), quindi è solo una volta. Ma tieni presente che l'Autenticatore sopra è solo un esempio minimo. Può gestire solo una password alla volta. Google, ad esempio, è in grado di gestire più host con password diverse.
Stroboskop,

3
Da 8u11 questo non funzionerà di default con l'autenticazione di base, oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes la proprietà di sistema deve essere impostata su emtpty
white

3
Nel caso abbiate dominio. Fai come segue:new PasswordAuthentication("domainName\\user", "password".toCharArray());
Sviluppatore Marius Žilėnas,

34

È abbastanza facile rispondere da Internet. Impostare le proprietà del sistema http.proxyHoste http.proxyPort. Puoi farlo con System.setProperty()o dalla riga di comando con la -Dsintassi.


19

I proxy sono supportati attraverso due proprietà di sistema: http.proxyHost e http.proxyPort. Devono essere impostati rispettivamente sul server proxy e sulla porta. Il seguente esempio di base lo illustra:

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 Sai per caso quali sono le principali differenze nell'uso dell'approccio Java più recente rispetto ad Apache commons-httpclient? Poiché Java supporta il proxy e l'autenticazione (come hai menzionato qui stackoverflow.com/questions/1626549/… ), per casi semplici (come recuperare un file dal server HTTP pubblico) non c'è motivo di usare la libreria Apache. Qual è la tua raccomandazione?
dma_k,

@dma_k Sono d'accordo con te, per casi d'uso semplici come quello che hai descritto non userei una libreria di terze parti.
Pascal Thivent

Sai come supportare i nonProxyHosts? Vedo che il mio dispositivo lo supporta ma non sa come gestirlo con la mia app.
RiRomain,

Ma la variabile systemPropertiesnon è usata dal connection!
parsecer

12

Puoi anche impostare

-Djava.net.useSystemProxies=true

Su Windows e Linux questo utilizzerà le impostazioni di sistema, quindi non è necessario ripetere te stesso (DRY)

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


6
Funziona solo con la configurazione manuale del server proxy. La configurazione automatica del proxy e i proxy configurati tramite script non sono (ancora) propagati a "useSystemProxies".
Tires,

1
Questo ha funzionato per me quando ho impostato proxyHost e proxyPort no. Grazie!
nrobey,

Allo stesso modo, questo ha funzionato da dietro il mio proxy aziendale quando le chiamate System.setPropertyper https.proxyHoste https.proxyPortper qualche motivo non stavano tagliando la senape.
Pavel Komarov,

10

Impostare quanto segue prima di aprireConnection,

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

Se il proxy richiede l'autenticazione,

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

7
In realtà penso che "http.proxyUser" e "http.proxyPassword" non sono più supportati. Vedi stackoverflow.com/questions/120797/… per maggiori dettagli.
p3t0r,


2

La risposta approvata funzionerà ... se conosci l'host proxy e la porta =). Ma nel caso in cui tu stia cercando l'host proxy e la porta, i passaggi seguenti dovrebbero essere d'aiuto

se viene fornito un proxy configurato automaticamente: allora

1> apri IE (o qualsiasi browser)

2> ottieni l'indirizzo URL dal tuo browser tramite IE-> Strumenti-> opzione Internet-> connessioni-> Impostazioni LAN-> ottieni l'indirizzo e inserisci l' URL, ad esempio: come http://autocache.abc.com/ e inserisci, a il file verrà scaricato in formato .pac, salvato sul desktop

3> apri il file .pac nel textpad, identifica PROXY:

Nel tuo editor, arriverà qualcosa del tipo:

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

complimenti a Bekur da Maven in 5 minuti non funziona

Una volta che hai l'host e la porta, entra in questo e sei pronto

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.