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.

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

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ą.


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 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


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

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


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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.