HttpURLConnection uygulamasının proxy kullanmasını nasıl sağlarım?


137

Bunu yaparsam ...

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

yazdırır

Proxy? false

Sorun şu ki, ben bir vekil arkasındayım. JVM Windows'da proxy bilgilerini nereden alıyor? Bunu nasıl ayarlarım? Diğer tüm uygulamalarım proxy'imden çok memnun görünüyor.

Yanıtlar:


337

Java 1.5'ten bu yana , yönteme bir java.net.Proxy örneği de iletebilirsiniz 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);

Proxy'niz kimlik doğrulaması gerektiriyorsa size 407 yanıtı verecektir.

Bu durumda aşağıdaki koda ihtiyacınız olacaktır:

    Authenticator authenticator = new Authenticator() {

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

7
üzerinden proxy kullanıcı adı ve proxy şifresi sağlayabilir miyiz?
Xolve

15
Farklı proxy'ler için farklı kullanıcı adı / şifre çiftleriniz varsa ne olur? Varsayılan Authenticator ayarlamak için statik bir yöntem çağırmak ideal değil, bu sys özellikleri yöntemini ayarlamaktan daha iyi değil ..
javaPhobic

2
Authenticator.default statik (yani global) bir değişkendir, bu yüzden yalnızca bir kez. Ancak yukarıdaki Authenticator'ın sadece minimal bir örnek olduğunu lütfen unutmayın. Bir seferde yalnızca bir parola işleyebilir. Google, farklı şifreleri olan birden çok ana bilgisayarı işleyebilecek örnekler için.
Stroboskop

3
8u11'den beri bu, Temel kimlik doğrulaması ile varsayılan olarak çalışmaz, oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSchemes sistem özelliği boş olarak ayarlanmalıdır
beyaz

3
Etki alanınız olması durumunda. Aşağıdaki gibi yapın:new PasswordAuthentication("domainName\\user", "password".toCharArray());
Geliştirici Marius Žilėnas

34

Bu internetten cevap vermek oldukça kolaydır. Sistem özelliklerini ayarlayın http.proxyHostve http.proxyPort. Bunu sözdizimiyle System.setProperty()veya -Dsözdizimiyle komut satırından yapabilirsiniz .


19

Proxy'ler iki sistem özelliği ile desteklenir: http.proxyHost ve http.proxyPort. Sırasıyla proxy sunucusuna ve bağlantı noktasına ayarlanmalıdırlar. Aşağıdaki temel örnek bunu göstermektedir:

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 Apache ile karşılaştırıldığında en yeni Java yaklaşımını kullanmanın en büyük farklarının neler olduğunu biliyor musunuz commons-httpclient? Java proxy ve kimlik doğrulamayı desteklediğinden (burada belirttiğiniz gibi stackoverflow.com/questions/1626549/… ), basit durumlar için (genel HTTP sunucusundan bir dosya almak gibi) Apache kitaplığını kullanmanız için bir neden yoktur. Önerin nedir?
dma_k

@ dma_k Size katılıyorum, tarif ettiğiniz gibi basit kullanım durumları için üçüncü taraf kitaplığı kullanmam.
Pascal Thivent

ProxyHost'ları nasıl destekleyeceğinizi biliyor musunuz? Cihazımın bunu desteklediğini görüyorum, ancak uygulamamın bunu nasıl yapacağını bilmiyor.
RiRomain

Ama değişken systemPropertiestarafından kullanılmaz connection!
parsecer

12

Ayrıca ayarlayabilirsiniz

-Djava.net.useSystemProxies=true

Windows ve Linux'ta bu sistem ayarlarını kullanır, böylece kendinizi tekrarlamanız gerekmez (DRY)

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


6
Bu yalnızca manuel proxy sunucu yapılandırmasıyla çalışır. Otomatik proxy yapılandırması ve komut dosyası aracılığıyla yapılandırılmış proxy'ler (henüz) "useSystemProxies" e yayılmaz.
lastikler

1
ProxyHost ve proxyPort ayarlandığında bu benim için çalıştı. Teşekkürler!
nrobey

Çağrılar Aynı şekilde, bu benim şirket vekil arkasından çalışmış System.setPropertyiçin https.proxyHostve https.proxyPortnedense hardal kesme değildi.
Pavel Komarov

10

Bağlantıyı açmadan önce aşağıdakileri ayarlayın,

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

Proxy kimlik doğrulaması gerektiriyorsa,

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

7
Aslında "http.proxyUser" ve "http.proxyPassword" artık desteklenmiyor düşünüyorum. Daha fazla bilgi için stackoverflow.com/questions/120797/… adresine bakın.
p3t0r

5

Java 1.8 ve sonraki sürümler -Djdk.http.auth.tunneling.disabledSchemes=için Temel Yetkilendirme ile proxy'lerin https ile çalışmasını sağlamanız gerekir .


1

2

Proxy ana makinenizi ve bağlantı noktanızı biliyorsanız) onaylanan cevap ... Ancak proxy ana bilgisayarını ve bağlantı noktasını arıyorsanız aşağıdaki adımlar yardımcı olacaktır

otomatik yapılandırılmış proxy verilirse:

1> açık IE (veya herhangi bir tarayıcı)

2> tarayıcınızdan url adresini IE-> Araçlar-> internet seçeneği-> bağlantılar-> LAN Ayarları-> adres alın ve url'yi girin örn. Http://autocache.abc.com/ girin ve girin, a dosya .pac formatında indirilecek, masaüstüne kaydedin

3> textpad'de .pac dosyasını açın, PROXY'yi tanımlayın:

Editörünüzde şöyle bir şey gelecek:

dönüş "PROXY web-proxy.ind.abc.com:8080; PROXY proxy.sgp.abc.com:8080";

5 dakika içinde maven bekur için kudos

Bir kez ev sahibi ve liman var bu içine ve gitmek için iyi içine pop

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
        URLConnection connection = new URL(url).openConnection(proxy);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.