2009-09-16 13 views
102

Jeśli mogę to zrobić ...Jak sprawić, aby HttpURLConnection używał serwera proxy?

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

drukuje

Proxy? false 

Problem polega na tym, jestem za serwerem proxy. Skąd JVM pobiera informacje o swoim proxy z systemu Windows? Jak to ustawić? Wszystkie moje inne aplikacje wydają się być całkowicie zadowolone z mojego proxy.

Odpowiedz

262

Ponieważ Java 1.5 można również przekazać instancję java.net.Proxy metody 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); 

Jeśli proxy wymaga uwierzytelniania da Ci response 407.

W takim przypadku potrzebny będzie następujący kod:

Authenticator authenticator = new Authenticator() { 

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

możemy zapewnić przez to nazwę użytkownika serwera proxy i hasło proxy. – Xolve

+1

Dokładnie to, co szukałem. A jednak przypadkowo kliknąłem downvote podczas kopiowania/wklejania, tylko po to, aby zauważyć zbyt późno, aby je cofnąć. Przepraszam. –

+9

Co zrobić, jeśli masz różne pary nazwa użytkownika/hasło dla różnych serwerów proxy? Wywołanie statycznej metody ustawiania domyślnego Authenticatora nie jest idealne, to nie jest dużo lepsze niż ustawienie właściwości sys. – javaPhobic

31

To dość łatwa odpowiedź z Internetu. Ustaw właściwości systemu http.proxyHost i http.proxyPort. Możesz to zrobić za pomocą System.setProperty() lub z wiersza poleceń ze składnią -D.

10

Ustaw następujące warunki przed wami OpenConnection,

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

Jeśli serwer proxy wymaga uwierzytelniania,

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

i rzeczywiście myśleć „http.proxyUser” i „http.proxyPassword” nie są już wspierane. Zobacz http://stackoverflow.com/questions/120797/how-do-i-set-the-proxy-to-be-used-by-the-jvm, aby uzyskać więcej informacji. – p3t0r

17

proxy są obsługiwane przez dwie właściwości systemu: http.proxyHost i http.proxyPort. Muszą być ustawione odpowiednio na serwer proxy i port. Poniższy przykład ilustruje podstawowy go:

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 Czy wiesz, jakie są główne różnice w korzystaniu z najnowszego podejścia Java w porównaniu do Apache 'commons-httpclient'? Ponieważ Java obsługuje proxy i uwierzytelnianie (jak wspomniano tutaj http://stackoverflow.com/questions/1626549/authenticated-http-proxy-with-java), dla prostych przypadków (takich jak pobranie jednego pliku z publicznego serwera HTTP) nie ma powód do korzystania z biblioteki Apache. Jakie jest Twoje zalecenie? –

+0

@dma_k Zgadzam się z Tobą, w prostych przypadkach, takich jak opisane, nie korzystałbym z biblioteki stron trzecich. –

+0

Czy wiesz, jak obsługiwać nonProxyHosts? Widzę, że moje urządzenie obsługuje je, ale nie wie, jak sprawić, by moja aplikacja go obsługiwała. – RiRomain

8

Można również ustawić

-Djava.net.useSystemProxies=true 

W systemie Windows i Linux będzie korzystać z ustawień systemowych, dzięki czemu nie trzeba powtarzać się (sucha)

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

+5

Działa to tylko z ręczną konfiguracją serwera proxy. Automatyczna konfiguracja proxy i serwery proxy skonfigurowane za pomocą skryptu nie są (jeszcze) propagowane do "useSystemProxies". – Tires

+0

To działało dla mnie podczas ustawiania proxyHost i proxyPort nie. Dzięki! – nrobey

2

Zatwierdzona odpowiedź będzie działać. .. jeśli znasz swój serwer proxy i port =). Jednak w przypadku szukasz hosta proxy i portu poniższe kroki powinny pomóc

jeśli auto skonfigurowany serwer proxy jest dany następnie

1> open IE (lub dowolnej przeglądarki)

2> pobierz adres URL z przeglądarki poprzez IE-> Narzędzia-> internet opcja-> połączenia-> Ustawienia LAN-> pobierz adres i podaj adres URL, np .: jako http://autocache.abc.com/ i wprowadź, plik zostanie pobrany z .pac format , zapisz na pulpicie

3> Otwórz plik PAC w TextPada zidentyfikować Proxy:

W edytorze, to przyjdzie coś takiego:

zwrot „Web Proxy-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080" ;

Kudos do bekur z maven in 5 min not working

Gdy masz hosta i port po prostu wyskoczyć na to i swoje dobre do

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

dla Java 1.8 i wyższej należy ustawić -Djdk.http.auth.tunneling.disabledSchemes= aby proxy z podstawowymi Autoryzacja pracy z https.

+0

Informacje ogólne na ten temat są omówione na stronie https://stackoverflow.com/questions/41806422/java-web-start-unable-to-tunnel-through-proxy-since-java-8-update-111 – U880D

Powiązane problemy