Jak sprawić, by HttpURLConnection używał proxy?

136

Jeśli to zrobię ...

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

drukuje

Proxy? false

Problem w tym, że jestem za proxy. Skąd maszyna JVM pobiera informacje o serwerze proxy w systemie Windows? Jak to ustawić? Wszystkie moje inne aplikacje wydają się być całkowicie zadowolone z mojego serwera proxy.

izb
źródło

Odpowiedzi:

336

Od wersji java 1.5 możesz również przekazać instancję java.net.Proxy do openConnection(proxy)metody:

//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 Twój serwer proxy wymaga uwierzytelnienia, otrzymasz odpowiedź 407.

W takim przypadku będziesz potrzebować następującego kodu:

    Authenticator authenticator = new Authenticator() {

        public PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("user",
                    "password".toCharArray()));
        }
    };
    Authenticator.setDefault(authenticator);
NickDK
źródło
7
czy możemy za jego pośrednictwem podać nazwę użytkownika i hasło proxy.
Xolve,
15
Co się stanie, jeśli masz różne pary nazwa użytkownika / hasło dla różnych serwerów proxy? Wywołanie metody statycznej w celu ustawienia domyślnego Authenticatora nie jest idealne, nie jest to dużo lepsze niż ustawienie metody właściwości sys ..
javaPhobic
2
Authenticator.default jest zmienną statyczną (tj. Globalną), więc jest dostępna tylko raz. Ale pamiętaj, że powyższy Authenticator to tylko minimalny przykład. Jednocześnie może obsługiwać tylko jedno hasło. Google dla przykładów, które mogą obsługiwać wiele hostów z różnymi hasłami.
Stroboskop
3
Od wersji 8u11 nie będzie to działać domyślnie z uwierzytelnianiem podstawowym, właściwość systemowa oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes musi być ustawiona na pustą
białą.
3
Jeśli masz domenę. Wykonaj następujące czynności:new PasswordAuthentication("domainName\\user", "password".toCharArray());
Deweloper Marius Žilėnas
34

Odpowiedź na to pytanie jest dość łatwa w Internecie. Ustaw właściwości systemu http.proxyHosti http.proxyPort. Możesz to zrobić za pomocą System.setProperty()lub z wiersza poleceń ze -Dskładnią.

Sean Owen
źródło
19

Serwery proxy są obsługiwane przez dwie właściwości systemowe: http.proxyHost i http.proxyPort. Muszą być ustawione odpowiednio na serwer proxy i port. Ilustruje to następujący podstawowy przykład:

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
źródło
@Pascal Czy wiesz, jakie są główne różnice między korzystaniem z najnowszego podejścia Java a Apache commons-httpclient? Ponieważ Java obsługuje proxy i uwierzytelnianie (jak wspomniałeś tutaj stackoverflow.com/questions/1626549/… ), w prostych przypadkach (takich jak pobranie jednego pliku z publicznego serwera HTTP) nie ma powodu, aby używać biblioteki Apache. Jaka jest Twoja rekomendacja?
dma_k
@dma_k Zgadzam się z tobą, w prostych przypadkach użycia, takich jak ten, który opisałeś, nie korzystałbym z biblioteki innej firmy.
Pascal Thivent
Czy wiesz, jak wspierać nonProxyHosts? Widzę, że moje urządzenie to obsługuje, ale nie wiem, jak sprawić, by moja aplikacja to obsługiwała.
RiRomain
Ale zmienna systemPropertiesnie jest używana przez connection!
parsecer
12

Możesz także ustawić

-Djava.net.useSystemProxies=true

W systemie Windows i Linux użyje to ustawień systemowych, więc nie musisz się powtarzać (DRY)

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

Daniel Worthington-Bodart
źródło
6
Działa to tylko przy ręcznej konfiguracji serwera proxy. Automatyczna konfiguracja proxy i serwery proxy skonfigurowane za pomocą skryptu nie są (jeszcze) propagowane do „useSystemProxies”.
Opony
1
To zadziałało dla mnie, gdy ustawienie proxyHost i proxyPort nie. Dzięki!
nrobey
Podobnie działało to zza mojego firmowego proxy, gdy dzwoniono do System.setPropertyniego https.proxyHostiz https.proxyPortjakiegoś powodu nie kroiliśmy musztardy.
Pavel Komarov
10

Ustaw śledzenie, zanim otworzysz Connection,

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

Jeśli serwer proxy wymaga uwierzytelnienia,

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");
ZZ Coder
źródło
7
Wydaje mi się, że „http.proxyUser” i „http.proxyPassword” nie są już obsługiwane. Więcej szczegółów znajdziesz na stackoverflow.com/questions/120797/… .
p3t0r
5

W przypadku Javy 1.8 i nowszych musisz ustawić -Djdk.http.auth.tunneling.disabledSchemes=serwery proxy z autoryzacją podstawową współpracujące z https.

Anton
źródło
1
Podstawowe informacje na ten temat są omówione na stackoverflow.com/questions/41806422/ ...
U880D
2

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

jeśli podano automatycznie skonfigurowany serwer proxy: to

1> otwórz IE (lub dowolną przeglądarkę)

2> pobierz adres url z przeglądarki poprzez IE-> Narzędzia-> opcje internetowe-> połączenia-> Ustawienia LAN-> pobierz adres i podaj w nim np .: jako http://autocache.abc.com/ i wpisz, a plik zostanie pobrany w formacie .pac, zapisz na pulpicie

3> otwórz plik .pac w TextPadzie, zidentyfikuj PROXY:

W twoim edytorze pojawi się coś takiego:

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

kudos to bekur from maven w 5 minut nie działa

Gdy masz już hosta i port, po prostu wejdź do tego i gotowe

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
Norbert
źródło