2009-09-16 17 views
102

Se faccio questo ...Come faccio a rendere HttpURLConnection un proxy?

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

esso stampa

Proxy? false 

Il problema è, io sono dietro un proxy. Da dove viene la JVM a ottenere le informazioni proxy da Windows? Come faccio a configurarlo? Tutte le mie altre app sembrano perfettamente felici con il mio proxy.

risposta

262

Dal momento che Java 1.5 è anche possibile passare un'istanza java.net.Proxy al metodo 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); 

Se il proxy richiede l'autenticazione che vi darà risposta 407.

In questo caso è necessario il seguente codice:

Authenticator authenticator = new Authenticator() { 

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

possiamo fornirci il nome utente proxy e la password proxy. – Xolve

+1

Esattamente quello che stavo cercando. Eppure accidentalmente ho cliccato verso il basso durante la copia/incolla, solo per notare troppo tardi per annullarlo. Scusate. –

+9

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

31

Questa è una risposta abbastanza semplice da Internet. Impostare le proprietà di sistema http.proxyHost e http.proxyPort. È possibile farlo con System.setProperty() o dalla riga di comando con la sintassi -D.

10

Set segue prima di OpenConnection,

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

Se proxy richiede l'autenticazione,

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

io in realtà penso "http.proxyUser" e "http.proxyPassword" non sono più supportate. 012. Vedere http://stackoverflow.com/questions/120797/how-do-i-set-proxy-to-be-used-by-the-jvm per ulteriori dettagli. – p3t0r

17

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); 
+0

@Pascal Ti capita di sapere quali sono le principali differenze nell'utilizzo dell'ultimo approccio Java rispetto a Apache 'commons-httpclient'? Poiché Java supporta il proxy e l'autenticazione (come accennato qui http://stackoverflow.com/questions/1626549/authenticated-http-proxy-with-java), per casi semplici (come recuperare un file dal server pubblico HTTP) non c'è ragione per usare la libreria Apache. Qual è la tua raccomandazione? –

+0

@dma_k Sono d'accordo con te, per casi di uso semplice come quello che hai descritto non avrei usato una libreria di terze parti. –

+0

Sai come supportare i nonProxyHosts? Vedo che il mio dispositivo lo supporta ma non sa come gestirlo. – RiRomain

8

È anche possibile impostare

-Djava.net.useSystemProxies=true 

Su Windows e Linux, questo utilizzerà le impostazioni di sistema in modo che non c'è bisogno di ripeterti (DRY)

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

+5

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

+0

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

2

La risposta approvato funzionerà. .. se conosci il tuo host proxy e port =). Ma nel caso in cui si sta cercando per l'host proxy e la porta alle fasi che seguono dovrebbero aiutare

se è dato automaticamente proxy configurato: poi

1> aperta IE (o qualsiasi browser)

2> ottenere l'indirizzo URL dal browser tramite IE-> Strumenti-> internet Option-> Connessioni-> LAN Impostazioni-> ottenere l'indirizzo e dare in url per esempio: come http://autocache.abc.com/ e inserire un file sarà scaricato con formato pac , salvare sul desktop

3> file pac aperto TextPad, identificare DELEGA:

Nel vostro editor, arriverà qualcosa di simile:

ritorno "proxy web-proxy.ind.abc.com:8080; PROCURA proxy.sgp.abc.com:8080" ;

complimenti a bekur da maven in 5 min not working

volta che avete l'host e la porta solo nel pop in questo e il vostro bene ad andare

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

per Java 1.8 o superiore è necessario impostare -Djdk.http.auth.tunneling.disabledSchemes= per realizzare il proxy con base autorizzazione a lavorare con https.

+0

Le informazioni di base su questo argomento sono discusse su https://stackoverflow.com/questions/41806422/java-web-start-unable-to-tunnel-through-proxy-since-java-8-update-111 – U880D

Problemi correlati