Menghubungkan Melalui Server Proxy di Core Java

1. Perkenalan

Server proxy bertindak sebagai perantara antara aplikasi klien dan server lain. Dalam pengaturan perusahaan, kami sering menggunakannya untuk membantu memberikan kontrol atas konten yang dikonsumsi pengguna, biasanya melintasi batas jaringan.

Dalam tutorial ini, kita akan melihat bagaimana menghubungkan melalui server proxy di Java .

Pertama, kita akan menjelajahi pendekatan yang lebih lama dan lebih global yang mencakup JVM dan dikonfigurasi dengan properti sistem. Setelah itu, kami akan memperkenalkan kelas Proxy , yang memberi kami kontrol lebih dengan mengizinkan konfigurasi pada basis per koneksi.

2. Penyiapan

Untuk menjalankan contoh di artikel ini, kita memerlukan akses ke server proxy. Squid adalah implementasi populer yang tersedia untuk kebanyakan sistem operasi. Konfigurasi default Squid sudah cukup baik untuk sebagian besar contoh kita.

3. Menggunakan Setting Global

Java memperlihatkan sekumpulan properti sistem yang dapat digunakan untuk mengonfigurasi perilaku di seluruh JVM. Pendekatan "satu ukuran untuk semua" ini sering kali merupakan yang paling sederhana untuk diterapkan jika sesuai untuk kasus penggunaan.

Kita dapat menyetel properti yang diperlukan dari baris perintah saat menjalankan JVM . Sebagai alternatif, kita juga bisa menyetelnya dengan memanggil System.setProperty () saat runtime .

3.1. Properti Sistem yang Tersedia

Java menyediakan penangan proxy untuk protokol HTTP, HTTPS, FTP, dan SOCKS. Proksi dapat ditentukan untuk setiap penangan sebagai nama host dan nomor port:

  • http.proxyHost - Nama host dari server proxy HTTP
  • http.proxyPort - Nomor port dari properti server proxy HTTP - adalah opsional dan default ke 80 jika tidak tersedia
  • http.nonProxyHosts - Daftar pola host yang dipisahkan tanda pipa (“|”) yang proxy harus dilewati - berlaku untuk penangan HTTP dan HTTPS jika disetel
  • socksProxyHost - Nama host dari server proxy SOCKS
  • socksProxyPort - Nomor port dari server proxy SOCKS

Jika menentukan nonProxyHosts , pola host dapat dimulai atau diakhiri dengan karakter wildcard (“*”). Mungkin perlu untuk keluar dari "|" pembatas pada platform Windows. Daftar lengkap semua properti sistem terkait proxy yang tersedia dapat ditemukan di dokumentasi Java resmi Oracle tentang properti jaringan.

3.2. Atur melalui Argumen Baris Perintah

Kita dapat mendefinisikan proxy pada baris perintah dengan memasukkan pengaturan sebagai properti sistem:

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

Saat memulai proses dengan cara ini, kami dapat menggunakan openConnection () di URL tanpa pekerjaan tambahan apa pun:

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

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

Jika kami tidak dapat mengatur properti proxy pada baris perintah, kami dapat mengaturnya 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(); // ...

Jika nanti kami membatalkan setelan properti sistem yang relevan secara manual, proxy tidak akan lagi digunakan:

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

3.4. Batasan Konfigurasi Global

Meskipun menggunakan konfigurasi global dengan properti sistem mudah diimplementasikan, pendekatan ini membatasi apa yang dapat kami lakukan karena setelan tersebut berlaku di seluruh JVM . Karena alasan ini, pengaturan yang ditentukan untuk protokol tertentu aktif selama JVM aktif atau sampai tidak ditetapkan.

Untuk mengatasi batasan ini, Anda mungkin tergoda untuk mengaktifkan dan menonaktifkan pengaturan sesuai kebutuhan. Untuk melakukan ini dengan aman dalam program multi-utas, perlu diperkenalkan tindakan untuk melindungi dari masalah konkurensi.

Sebagai alternatif, API Proxy memberikan kontrol yang lebih terperinci atas konfigurasi proxy.

4. Menggunakan API Proxy

Kelas Proxy memberi kita cara yang fleksibel untuk mengonfigurasi proxy pada basis per koneksi. Jika ada setelan proxy seluruh JVM yang ada, setelan proxy berbasis sambungan yang menggunakan kelas Proxy akan menimpanya.

Ada tiga jenis proxy yang kita dapat mendefinisikan dengan Proxy.Type :

  • HTTP - proxy yang menggunakan protokol HTTP
  • SOCKS - proxy menggunakan protokol SOCKS
  • DIRECT - koneksi langsung yang dikonfigurasi secara eksplisit tanpa proxy

4.1. Menggunakan Proxy HTTP

Untuk menggunakan proxy HTTP, pertama-tama kita membungkus instance SocketAddress dengan Proxy dan tipe Proxy.Type.HTTP . Selanjutnya, kita cukup meneruskan instance Proxy 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);

Sederhananya, ini berarti kita akan terhubung ke URL_STRING , tetapi kemudian merutekan koneksi tersebut melalui server proxy yang dihosting di 127.0.0.1:3128 .

4.2. Menggunakan Direct Proxy

Kami mungkin memiliki persyaratan untuk terhubung langsung ke host. Dalam kasus ini, kami dapat secara eksplisit melewati proxy yang mungkin dikonfigurasi secara global dengan menggunakan instance Proxy.NO_PROXY statis . Di bawah sampulnya, API membuat instance baru dari Proxy untuk kita, menggunakan Proxy.Type.DIRECT sebagai tipe :

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

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

4.3. Menggunakan Proxy 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 lama, yang lebih global untuk menghubungkan melalui server proxy menggunakan properti sistem. Kemudian, kami melihat cara menggunakan kelas Proxy , yang memberikan kontrol yang sangat baik saat menghubungkan melalui server proxy.

Seperti biasa, semua kode sumber yang digunakan dalam artikel ini dapat ditemukan di GitHub.