Menghubungkan Melalui Pelayan Proksi di Java Core

1. Pengenalan

Pelayan proksi bertindak sebagai perantara antara aplikasi klien dan pelayan lain. Dalam persekitaran perusahaan, kami sering menggunakannya untuk membantu memberikan kawalan terhadap kandungan yang pengguna gunakan, biasanya melintasi batas rangkaian.

Dalam tutorial ini, kita akan melihat cara menyambung melalui pelayan proksi di Java .

Pertama, kita akan meneroka pendekatan yang lebih lama dan lebih global yang seluas JVM dan dikonfigurasi dengan sifat sistem. Selepas itu, kami akan memperkenalkan kelas Proksi , yang memberi kami lebih banyak kawalan dengan membenarkan konfigurasi setiap sambungan.

2. Persediaan

Untuk menjalankan sampel dalam artikel ini, kami memerlukan akses ke pelayan proksi. Squid adalah pelaksanaan yang popular yang tersedia untuk kebanyakan sistem operasi. Konfigurasi lalai Squid akan cukup baik untuk kebanyakan contoh kami.

3. Menggunakan Tetapan Global

Java memperlihatkan sekumpulan sifat sistem yang dapat digunakan untuk mengkonfigurasi perilaku JVM. “Satu ukuran sesuai dengan semua pendekatan” ini seringkali paling mudah dilaksanakan jika sesuai untuk kes penggunaan.

Kita boleh menetapkan sifat yang diperlukan dari baris perintah ketika memanggil JVM . Sebagai alternatif, kita juga dapat menetapkannya dengan memanggil System.setProperty () pada waktu runtime .

3.1. Sifat Sistem yang Ada

Java menyediakan pengendali proksi untuk protokol HTTP, HTTPS, FTP, dan SOCKS. Proksi boleh ditentukan untuk setiap pengendali sebagai nama host dan nombor port:

  • http.proxyHost - Nama hos pelayan proksi HTTP
  • http.proxyPort - Nombor port pelayan proksi HTTP - harta tanah adalah pilihan dan lalai menjadi 80 jika tidak disediakan
  • http.nonProxyHosts - Senarai corak hos yang dibatasi paip ("|") di mana proksi harus dilewati - berlaku untuk pengendali HTTP dan HTTPS jika ditetapkan
  • socksProxyHost - Nama hos pelayan proksi SOCKS
  • socksProxyPort - Nombor port pelayan proksi SOCKS

Sekiranya menentukan nonProxyHosts , corak host mungkin bermula atau diakhiri dengan watak wildcard (“*”). Mungkin perlu melarikan diri dari "|" pembatas pada platform Windows. Senarai lengkap semua sifat sistem yang berkaitan dengan proksi boleh didapati dalam dokumentasi Java rasmi Oracle mengenai sifat rangkaian.

3.2. Tetapkan melalui Argumen Baris Perintah

Kita dapat menentukan proksi pada baris perintah dengan meneruskan tetapan sebagai sifat sistem:

java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 com.baeldung.networking.proxies.CommandLineProxyDemo

Semasa memulakan proses dengan cara ini, kita hanya dapat menggunakan openConnection () pada URL tanpa kerja tambahan:

URL url = new URL(RESOURCE_URL); URLConnection con = url.openConnection();

3.3. Tetapkan Menggunakan System.setProperty (String, String)

Sekiranya kami tidak dapat menetapkan sifat proksi pada baris arahan, kami dapat menetapkannya dengan panggilan ke System.setProperty () dalam program kami:

System.setProperty("http.proxyHost", "127.0.0.1"); System.setProperty("http.proxyPort", "3128"); URL url = new URL(RESOURCE_URL); URLConnection con = url.openConnection(); // ...

Sekiranya kemudian kami menyahaktifkan sifat sistem yang relevan secara manual, maka proksi tidak akan digunakan lagi:

System.setProperty("http.proxyHost", null);

3.4. Batasan Konfigurasi Global

Walaupun menggunakan konfigurasi global dengan sifat sistem mudah dilaksanakan, pendekatan ini membatasi apa yang dapat kita lakukan kerana tetapan tersebut berlaku di seluruh JVM . Atas sebab ini, tetapan yang ditentukan untuk protokol tertentu aktif untuk jangka masa JVM atau sehingga tidak ditetapkan.

Untuk mengatasi batasan ini, mungkin menggoda untuk menghidupkan dan mematikan tetapan yang diperlukan. Untuk melakukan ini dengan selamat dalam program multi-utas, adalah perlu untuk memperkenalkan langkah-langkah untuk melindungi daripada masalah bersamaan.

Sebagai alternatif, Proxy API memberikan kawalan yang lebih terperinci terhadap konfigurasi proksi.

4. Menggunakan Proxy API

The Proxy kelas memberikan kita cara yang fleksibel kepada proksi configure pada dasar setiap sambungan. Sekiranya terdapat tetapan proksi seluas JVM yang ada, tetapan proksi berasaskan sambungan yang menggunakan kelas Proksi akan menimpanya.

Terdapat tiga jenis proksi yang dapat kita tentukan dengan Proksi. Jenis :

  • HTTP - proksi menggunakan protokol HTTP
  • SOCKS - proksi menggunakan protokol SOCKS
  • LANGSUNG - sambungan langsung yang dikonfigurasi secara eksplisit tanpa proksi

4.1. Menggunakan Proksi HTTP

Untuk menggunakan proksi HTTP, pertama-tama kami membungkus contoh SocketAddress dengan Proksi dan jenis Proxy.Type.HTTP . Seterusnya, kami hanya menyampaikan contoh Proksi ke URLConnection.openConnection ():

URL weburl = new URL(URL_STRING); Proxy webProxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 3128)); HttpURLConnection webProxyConnection = (HttpURLConnection) weburl.openConnection(webProxy);

Ringkasnya, ini bermaksud kita akan menyambung ke URL_STRING , tetapi kemudian jalankan sambungan itu melalui pelayan proksi yang dihoskan di 127.0.0.1:3128 .

4.2. Menggunakan Proksi LANGSUNG

Kami mungkin mempunyai syarat untuk berhubung terus dengan hos. Dalam kes ini, kita dapat secara jelas memintas proksi yang mungkin dikonfigurasi secara global dengan menggunakan instance Proxy.NO_PROXY statik . Di bawah penutup, API membina contoh Proksi baru untuk kami, menggunakan Proxy.Type.DIRECT sebagai jenis :

HttpURLConnection directConnection = (HttpURLConnection) weburl.openConnection(Proxy.NO_PROXY);

Pada asasnya, jika tidak ada proksi yang dikonfigurasi secara global, maka ini sama dengan memanggil openConnection () tanpa argumen.

4.3. Menggunakan Proksi SOCKS

Using a SOCKS proxy is similar to the HTTP variant when working with URLConnection. We start by wrapping a SocketAddress instance with a Proxy using a type of Proxy.Type.SOCKS. Afterward, we pass the Proxy instance to URLConnection.openConnection:

Proxy socksProxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 1080)); HttpURLConnection socksConnection = (HttpURLConnection) weburl.openConnection(socksProxy); 

It's also possible to use a SOCKS proxy when connecting to a TCP socket. First, we use the Proxy instance to construct a Socket. Afterward, we pass the destination SocketAddress instance to Socket.connect():

Socket proxySocket = new Socket(socksProxy); InetSocketAddress socketHost = new InetSocketAddress(SOCKET_SERVER_HOST, SOCKET_SERVER_PORT); proxySocket.connect(socketHost);

5. Conclusion

In this article, we looked at how to work with proxy servers in core Java.

Pertama, kami melihat gaya penyambungan lama yang lebih global melalui pelayan proksi menggunakan sifat sistem. Kemudian, kami melihat cara menggunakan kelas Proksi , yang memberikan kawalan yang terperinci ketika menyambung melalui pelayan proksi.

Seperti biasa, semua kod sumber yang digunakan dalam artikel ini boleh didapati di GitHub.