Bagaimana cara membuat HttpURLConnection menggunakan proxy?

136

Jika saya melakukan ini ...

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

itu mencetak

Proxy? false

Masalahnya adalah, saya berada di belakang proxy. Di mana JVM mendapatkan informasi proksi dari pada Windows? Bagaimana cara mengatur ini? Semua aplikasi saya yang lain tampak sangat senang dengan proxy saya.

izb
sumber

Jawaban:

336

Karena java 1.5, Anda juga dapat mengirimkan instance java.net. Proxy ke openConnection(proxy)metode:

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

Jika proxy Anda memerlukan autentikasi, itu akan memberi Anda respons 407.

Dalam hal ini Anda memerlukan kode berikut:

    Authenticator authenticator = new Authenticator() {

        public PasswordAuthentication getPasswordAuthentication() {
            return (new PasswordAuthentication("user",
                    "password".toCharArray()));
        }
    };
    Authenticator.setDefault(authenticator);
NickDK
sumber
7
dapatkah kami memberikan nama pengguna proxy dan kata sandi proxy melaluinya.
Xolve
15
Bagaimana jika Anda memiliki pasangan nama pengguna / kata sandi yang berbeda untuk proksi yang berbeda? Memanggil metode statis untuk menetapkan Authenticator default tidak ideal, ini tidak jauh lebih baik daripada mengatur metode properti sys ..
javaPhobic
2
Authenticator.default adalah variabel statis (yaitu global), jadi itu hanya sekali. Tetapi harap dicatat bahwa Authenticator di atas hanyalah contoh minimal. Itu hanya dapat menangani satu kata sandi sekaligus. Google untuk contoh yang dapat menangani beberapa host dengan kata sandi yang berbeda.
Stroboskop
3
Sejak 8u11 ini tidak akan berfungsi secara default dengan otentikasi Dasar, oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html jdk.http.auth.tunneling.disabledSistem properti properti sistem harus disetel ke emtpty
white
3
Jika Anda memiliki domain. Lakukan sebagai berikut:new PasswordAuthentication("domainName\\user", "password".toCharArray());
Pengembang Marius Žilėnas
34

Ini cukup mudah dijawab dari internet. Setel properti sistem http.proxyHostdan http.proxyPort. Anda dapat melakukan ini dengan System.setProperty(), atau dari baris perintah dengan -Dsintaks.

Sean Owen
sumber
19

Proxy didukung melalui dua properti sistem: http.proxyHost dan http.proxyPort. Mereka harus diatur ke server proxy dan port masing-masing. Contoh dasar berikut menggambarkannya:

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);
Thivent Pascal
sumber
@ Pascal Apakah Anda tahu apa perbedaan utama menggunakan pendekatan Java terbaru dibandingkan dengan Apache commons-httpclient? Karena Java mendukung proxy dan otentikasi (seperti yang Anda sebutkan di sini stackoverflow.com/questions/1626549/… ), untuk kasus-kasus sederhana (seperti mengambil satu file dari server HTTP publik), tidak ada alasan untuk menggunakan perpustakaan Apache. Apa rekomendasi Anda?
dma_k
@dma_k Saya setuju dengan Anda, untuk kasus penggunaan sederhana seperti yang Anda jelaskan saya tidak akan menggunakan perpustakaan pihak ketiga.
Pascal Thivent
Apakah Anda tahu cara mendukung nonProxyHosts? Saya melihat bahwa perangkat saya mendukungnya tetapi tidak tahu bagaimana membuat aplikasi saya menanganinya.
RiRomain
Tetapi variabel systemPropertiestidak digunakan oleh connection!
parsecer
12

Anda juga bisa mengatur

-Djava.net.useSystemProxies=true

Di Windows dan Linux ini akan menggunakan pengaturan sistem sehingga Anda tidak perlu mengulangi diri sendiri (KERING)

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

Daniel Worthington-Bodart
sumber
6
Ini hanya berfungsi dengan konfigurasi server proxy manual. Konfigurasi proxy otomatis dan proxy yang dikonfigurasi melalui skrip belum (belum) disebarkan ke "useSystemProxies".
Ban
1
Ini berfungsi untuk saya ketika mengatur proxyHost dan proxyPort tidak. Terima kasih!
nrobey
Demikian juga, ini bekerja dari belakang proksi perusahaan saya ketika panggilan ke System.setPropertyuntuk https.proxyHostdan https.proxyPortuntuk beberapa alasan tidak memotong mustard.
Pavel Komarov
10

Tetapkan berikut ini sebelum Anda membuka Koneksi,

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

Jika proxy memerlukan otentikasi,

System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");
ZZ Coder
sumber
7
Saya sebenarnya berpikir "http.proxyUser" dan "http.proxyPassword" tidak didukung lagi. Lihat stackoverflow.com/questions/120797/… untuk lebih jelasnya.
p3t0r
5

Untuk Java 1.8 dan lebih tinggi, Anda harus mengatur -Djdk.http.auth.tunneling.disabledSchemes=untuk membuat proksi dengan Otorisasi Dasar bekerja dengan https.

Anton
sumber
1
Informasi latar belakang tentang ini dibahas di stackoverflow.com/questions/41806422/…
U880D
2

Jawaban yang disetujui akan berfungsi ... jika Anda mengetahui host proxy dan port =). Tetapi jika Anda mencari host proxy dan port langkah-langkah di bawah ini akan membantu

jika proksi yang dikonfigurasi secara otomatis diberikan: maka

1> buka IE (atau browser apa saja)

2> dapatkan alamat url dari browser Anda melalui IE-> Tools-> opsi internet-> koneksi-> Pengaturan LAN-> dapatkan alamat dan berikan url misalnya: sebagai http://autocache.abc.com/ dan masukkan, a file akan diunduh dengan format .pac, simpan ke desktop

3> buka file .pac di bidang teks, identifikasi PROXY:

Di editor Anda, akan muncul sesuatu seperti:

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

pujian untuk bekur dari pakar dalam 5 menit tidak bekerja

Setelah Anda memiliki host dan port hanya masuk ke ini dan Anda baik untuk pergi

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