Atur bendera JVM http.proxyHostdan http.proxyPortketika memulai JVM Anda pada baris perintah. Ini biasanya dilakukan dalam skrip shell (di Unix) atau file bat (di Windows). Inilah contoh dengan skrip shell Unix:
Ingatlah bahwa proksi HTTP dan proksi SOCKS beroperasi pada tingkat yang berbeda di tumpukan jaringan, sehingga Anda dapat menggunakan satu atau yang lain atau keduanya.
Cukup kembalikan nilai yang benar dari metode needsProxy(), getProxyHost()dan getProxyPort()dan Anda dapat memanggil potongan kode ini kapan pun Anda mau.
"proxySet" tidak melakukan apa pun. Bukti: setel ke "false". Tidak ada dan tidak pernah ada properti seperti itu di JDK, meskipun ada berbagai buku dan referensi online. Itu datang dari HotJavaBean yang sudah lama mati, browser yang dienkapsulasi, meninggal pada sekitar tahun 1998.
Marquis of Lorne
2
Benarkah nama properti tanpa http / https?
Betlista
18
Ini salah dalam tiga hal: 1: seperti yang disebutkan, tidak ada item "proxySet"; 2: "proxyHost" dan "proxyPort" harus "http.proxyHost" dan "http.proxyPort" (atau yang setara dengan 'https'); 3: System.getProperties (). Put (X, Y) tidak sama dengan System.setProperty (X, Y). Selain itu, meskipun - jawaban yang bagus.
@RobCranfill 1: "proxySet" digunakan untuk menjadi bendera non-standar yang diperlukan oleh JDK lama tetapi tidak diperlukan lagi; 2: "proxyHost" dan "proxyPort" berfungsi, "http." awalan hanya membatasi mereka ke protokol HTTP (mirip untuk "https."), 3: di sini Anda benar.
toolforger
24
JVM menggunakan proxy untuk melakukan panggilan HTTP
import java.net.Authenticator;importProxyAuthenticator;publicclassExample{publicstaticvoid main(String[] args){String username =System.getProperty("proxy.authentication.username");String password =System.getProperty("proxy.authentication.password");if(username !=null&&!username.equals("")){Authenticator.setDefault(newProxyAuthenticator(username, password));}// here your JVM will be authenticated}}
ini tidak bekerja. jika Anda belum mengautentikasi, baris pertama pada fungsi utama mendapat banyak nilai nol dan kode berhenti. Ini tidak membantu seseorang mengautentikasi jvm mereka sehingga mereka dapat melakukan panggilan URL melalui proxy.
Randnum
12
Menggabungkan jawaban Sorter dan javabrett / Leonel:
Setel java.net.useSystemProxiesproperti ke true. Anda dapat mengaturnya, misalnya, melalui variabel lingkungan JAVA_TOOL_OPTIONS . Di Ubuntu, Anda dapat, misalnya, menambahkan baris berikut ke .bashrc:
Berikut ini menunjukkan cara mengatur proxy Java dengan pengguna proxy dan kata sandi proxy dari baris perintah, yang merupakan kasus yang sangat umum. Anda tidak boleh menyimpan kata sandi dan host di kode, sebagai aturan di tempat pertama.
Melewati properti sistem dalam baris perintah dengan -D dan mengaturnya dalam kode dengan System.setProperty ("name", "value") adalah setara.
ProxyUser dan proxyPassword bukan properti sistem Java, tetapi properti klien HTTP Apache jadi ini tidak bekerja dalam semua kasus.
THelper
8
membaca file XML dan perlu mengunduh skemanya
Jika Anda mengandalkan skema pengambilan atau DTD melalui internet, Anda sedang membangun aplikasi yang lambat, cerewet, dan rapuh. Apa yang terjadi ketika server jauh yang meng-host file mengambil downtime yang direncanakan atau tidak terencana? Aplikasi Anda rusak. Apakah itu oke?
URL untuk skema dan sejenisnya paling baik dianggap sebagai pengidentifikasi unik. Bukan sebagai permintaan untuk benar-benar mengakses file itu dari jarak jauh. Lakukan pencarian google di "katalog XML". Katalog XML memungkinkan Anda untuk meng-host sumber daya tersebut secara lokal, menyelesaikan kelambatan, mengobrol dan kerapuhan.
Ini pada dasarnya adalah salinan konten remote yang di-cache secara permanen. Dan itu tidak masalah, karena konten jarak jauh tidak akan pernah berubah. Jika ada pembaruan, itu akan berada di URL yang berbeda. Membuat pengambilan sumber daya yang sebenarnya melalui internet sangat konyol.
Ini adalah pembaruan kecil, tetapi sejak Java 7, koneksi proxy sekarang dapat dibuat secara pemrograman daripada melalui properti sistem. Ini mungkin berguna jika:
Proxy perlu diputar secara dinamis selama runtime program
Baru-baru ini saya menemukan cara untuk memungkinkan JVM menggunakan pengaturan proxy browser. Yang perlu Anda lakukan adalah menambahkan ${java.home}/lib/deploy.jarke proyek Anda dan masuk ke perpustakaan seperti berikut:
import com.sun.deploy.net.proxy.DeployProxySelector;import com.sun.deploy.services.PlatformType;import com.sun.deploy.services.ServiceManager;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;publicabstractclassExtendedProxyManager{privatestaticfinalLog logger =LogFactory.getLog(ExtendedProxyManager.class);/**
* After calling this method, proxy settings can be magically retrieved from default browser settings.
*/publicstaticboolean init(){
logger.debug("Init started");// Initialization code was taken from com.sun.deploy.ClientContainer:ServiceManager.setService(System.getProperty("os.name").toLowerCase().indexOf("windows")!=-1?PlatformType.STANDALONE_TIGER_WIN32
:PlatformType.STANDALONE_TIGER_UNIX);try{// This will call ProxySelector.setDefault():DeployProxySelector.reset();}catch(Throwable throwable){
logger.error("Unable to initialize extended dynamic browser proxy settings support.", throwable);returnfalse;}returntrue;}}
Setelah itu pengaturan proxy tersedia untuk Java API via java.net.ProxySelector.
Satu-satunya masalah dengan pendekatan ini adalah Anda harus menjalankan JVM dengan deploy.jardi bootclasspath misalnya java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar. Jika seseorang tahu cara mengatasi batasan ini, beri tahu saya.
Saya berharap saya dapat memperbaiki ini beberapa kali, itu adalah satu-satunya solusi yang bekerja untuk saya; Terima kasih! Saya harus mengunduh toples log apache commons dari sini: commons.apache.org/proper/commons-logging/download_logging.cgi Kode saya di Main (): System.setProperty ("java.net.useSystemProxies", "true") ; System.out.println ("mendeteksi proksi"); ExtendedProxyManager.init ();
Boris
Apa yang ingin xbootclasspathditerapkan deploy.jar untuk efeknya, tidak bisakah saya membawa jar itu ke classpath normal saya (ketika berjalan tanpa webstart)?
Houtman
1
di JDK 9, gagal :( Exception in thread "main" java.lang.IllegalAccessError: class ...) cannot access class com.sun.deploy.net.proxy.DeployProxySelector (in module jdk.deploy) because module jdk.deploy does not export com.sun.deploy.net.proxy
Jawaban ini tidak memberikan apa pun yang belum dikatakan dalam jawaban lain.
Simon Forsberg
1
Seperti yang ditunjukkan dalam jawaban lain, jika Anda perlu menggunakan proxy terotentikasi, tidak ada cara yang dapat diandalkan untuk melakukan ini murni menggunakan variabel baris perintah - yang mengganggu jika Anda menggunakan aplikasi orang lain dan tidak ingin mengacaukan dengan Kode sumber.
Misalnya dengan Proxifier, Anda dapat mengaturnya hanya untuk mencegat perintah java yang akan dikelola dan dialihkan melalui proxy (yang diotentikasi). Anda akan ingin mengeset nilai proxyHost dan proxyPort menjadi kosong dalam kasus ini, misalnya, melewatinya-Dhttp.proxyHost= -Dhttp.proxyPort= perintah java Anda.
Anda dapat menggunakan variabel http.proxy * JVM jika Anda berada dalam JVM mandiri tetapi Anda TIDAK HARUS memodifikasi skrip startup mereka dan / atau melakukan ini dalam server aplikasi Anda (kecuali mungkin jboss atau tomcat). Alih-alih, Anda harus menggunakan JAVA Proxy API (bukan System.setProperty) atau menggunakan opsi konfigurasi vendor sendiri. Baik WebSphere dan WebLogic memiliki cara yang sangat jelas untuk mengatur proksi yang jauh lebih kuat daripada J2SE. Selain itu, untuk WebSphere dan WebLogic Anda mungkin akan memecah server aplikasi Anda dengan cara-cara kecil dengan menimpa skrip startup (terutama proses interop server karena Anda mungkin memberi tahu mereka untuk menggunakan proxy Anda juga ...).
Jawaban:
Dari dokumentasi Java ( bukan API javadoc):
http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html
Atur bendera JVM
http.proxyHost
danhttp.proxyPort
ketika memulai JVM Anda pada baris perintah. Ini biasanya dilakukan dalam skrip shell (di Unix) atau file bat (di Windows). Inilah contoh dengan skrip shell Unix:Saat menggunakan wadah seperti JBoss atau WebLogic, solusi saya adalah mengedit skrip start-up yang disediakan oleh vendor.
Banyak pengembang yang akrab dengan Java API (javadocs), tetapi sering kali sisa dokumentasi diabaikan. Ini berisi banyak informasi menarik: http://download.oracle.com/javase/6/docs/technotes/guides/
Pembaruan: Jika Anda tidak ingin menggunakan proxy untuk menyelesaikan beberapa host lokal / intranet, periksa komentar dari @Tomalak:
sumber
http.nonProxyHosts
properti! (gunakan seperti ini:-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com|etc"
)http.proxyUser
danhttp.proxyPassword
bukan properti sistem Java. Itu untuk klien HTTP Apache.https.proxyHost
danhttps.proxyPort
untuk HTTPs.Untuk menggunakan pengaturan proxy sistem:
Atau secara terprogram:
Sumber: http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html
sumber
Untuk mengatur HTTP / HTTPS dan / atau proxy SOCKS secara terprogram:
Ingatlah bahwa proksi HTTP dan proksi SOCKS beroperasi pada tingkat yang berbeda di tumpukan jaringan, sehingga Anda dapat menggunakan satu atau yang lain atau keduanya.
sumber
Anda dapat mengatur bendera tersebut secara terprogram seperti ini:
Cukup kembalikan nilai yang benar dari metode
needsProxy()
,getProxyHost()
dangetProxyPort()
dan Anda dapat memanggil potongan kode ini kapan pun Anda mau.sumber
JVM menggunakan proxy untuk melakukan panggilan HTTP
Ini dapat menggunakan proxy pengaturan pengguna
sumber
System.setProperty
sebagai gantiSystem.getProperties().put(...)
Anda dapat mengatur beberapa properti tentang server proxy sebagai parameter jvm
-Dhttp.proxyPort = 8080, proxyHost, dll.
tetapi jika Anda perlu melewati proxy autentikasi, Anda memerlukan autentikator seperti contoh ini:
ProxyAuthenticator.java
Contoh.java
Berdasarkan jawaban ini: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E
sumber
Menggabungkan jawaban Sorter dan javabrett / Leonel:
sumber
Setel
java.net.useSystemProxies
properti ketrue
. Anda dapat mengaturnya, misalnya, melalui variabel lingkungan JAVA_TOOL_OPTIONS . Di Ubuntu, Anda dapat, misalnya, menambahkan baris berikut ke.bashrc
:sumber
Berikut ini menunjukkan cara mengatur proxy Java dengan pengguna proxy dan kata sandi proxy dari baris perintah, yang merupakan kasus yang sangat umum. Anda tidak boleh menyimpan kata sandi dan host di kode, sebagai aturan di tempat pertama.
Melewati properti sistem dalam baris perintah dengan -D dan mengaturnya dalam kode dengan System.setProperty ("name", "value") adalah setara.
Tapi perhatikan ini
Contoh yang berfungsi:
Tetapi yang berikut ini tidak berfungsi :
Satu-satunya perbedaan adalah posisi properti sistem! (sebelum dan sesudah kelas)
Jika Anda memiliki karakter khusus dalam kata sandi, Anda diizinkan memasukkannya dalam tanda kutip "@ MyPass123%", seperti dalam contoh di atas.
Jika Anda mengakses layanan HTTPS, Anda harus menggunakan
https.proxyHost
,https.proxyPort
dll.Jika Anda mengakses layanan HTTP, Anda harus menggunakan
http.proxyHost
,http.proxyPort
dll.sumber
Jika Anda mengandalkan skema pengambilan atau DTD melalui internet, Anda sedang membangun aplikasi yang lambat, cerewet, dan rapuh. Apa yang terjadi ketika server jauh yang meng-host file mengambil downtime yang direncanakan atau tidak terencana? Aplikasi Anda rusak. Apakah itu oke?
Lihat http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files
URL untuk skema dan sejenisnya paling baik dianggap sebagai pengidentifikasi unik. Bukan sebagai permintaan untuk benar-benar mengakses file itu dari jarak jauh. Lakukan pencarian google di "katalog XML". Katalog XML memungkinkan Anda untuk meng-host sumber daya tersebut secara lokal, menyelesaikan kelambatan, mengobrol dan kerapuhan.
Ini pada dasarnya adalah salinan konten remote yang di-cache secara permanen. Dan itu tidak masalah, karena konten jarak jauh tidak akan pernah berubah. Jika ada pembaruan, itu akan berada di URL yang berbeda. Membuat pengambilan sumber daya yang sebenarnya melalui internet sangat konyol.
sumber
Saya juga di belakang firewall, ini bekerja untuk saya !!
sumber
Jika Anda ingin "Socks Proxy", informasikan argumen VM "socksProxyHost" dan "socksProxyPort".
misalnya
sumber
Tambahkan ini sebelum Anda terhubung ke URL di belakang proxy.
sumber
http.proxyUser
danhttp.proxyPassword
bukan properti sistem Java. Itu untuk klien HTTP Apache.System.setProperty
sebagai gantiSystem.getProperties().put(...)
Ini adalah pembaruan kecil, tetapi sejak Java 7, koneksi proxy sekarang dapat dibuat secara pemrograman daripada melalui properti sistem. Ini mungkin berguna jika:
Berikut adalah contoh yang dibuat di groovy:
Referensi Lengkap: http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html
sumber
Baru-baru ini saya menemukan cara untuk memungkinkan JVM menggunakan pengaturan proxy browser. Yang perlu Anda lakukan adalah menambahkan
${java.home}/lib/deploy.jar
ke proyek Anda dan masuk ke perpustakaan seperti berikut:Setelah itu pengaturan proxy tersedia untuk Java API via
java.net.ProxySelector
.Satu-satunya masalah dengan pendekatan ini adalah Anda harus menjalankan JVM dengan
deploy.jar
di bootclasspath misalnyajava -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar
. Jika seseorang tahu cara mengatasi batasan ini, beri tahu saya.sumber
xbootclasspath
diterapkan deploy.jar untuk efeknya, tidak bisakah saya membawa jar itu ke classpath normal saya (ketika berjalan tanpa webstart)?Exception in thread "main" java.lang.IllegalAccessError: class ...) cannot access class com.sun.deploy.net.proxy.DeployProxySelector (in module jdk.deploy) because module jdk.deploy does not export com.sun.deploy.net.proxy
Itu bekerja untuk saya:
P / S: Saya mendasarkan pada jawaban GHad.
sumber
Seperti yang ditunjukkan dalam jawaban lain, jika Anda perlu menggunakan proxy terotentikasi, tidak ada cara yang dapat diandalkan untuk melakukan ini murni menggunakan variabel baris perintah - yang mengganggu jika Anda menggunakan aplikasi orang lain dan tidak ingin mengacaukan dengan Kode sumber.
Will Iverson membuat saran yang bermanfaat di Menggunakan HttpProxy untuk terhubung ke host dengan otentikasi preemtive untuk menggunakan alat manajemen Proxy seperti Proxifier ( http://www.proxifier.com/ untuk Mac OS X dan Windows) untuk menangani hal ini.
Misalnya dengan Proxifier, Anda dapat mengaturnya hanya untuk mencegat perintah java yang akan dikelola dan dialihkan melalui proxy (yang diotentikasi). Anda akan ingin mengeset nilai proxyHost dan proxyPort menjadi kosong dalam kasus ini, misalnya, melewatinya
-Dhttp.proxyHost= -Dhttp.proxyPort=
perintah java Anda.sumber
Anda dapat menggunakan variabel http.proxy * JVM jika Anda berada dalam JVM mandiri tetapi Anda TIDAK HARUS memodifikasi skrip startup mereka dan / atau melakukan ini dalam server aplikasi Anda (kecuali mungkin jboss atau tomcat). Alih-alih, Anda harus menggunakan JAVA Proxy API (bukan System.setProperty) atau menggunakan opsi konfigurasi vendor sendiri. Baik WebSphere dan WebLogic memiliki cara yang sangat jelas untuk mengatur proksi yang jauh lebih kuat daripada J2SE. Selain itu, untuk WebSphere dan WebLogic Anda mungkin akan memecah server aplikasi Anda dengan cara-cara kecil dengan menimpa skrip startup (terutama proses interop server karena Anda mungkin memberi tahu mereka untuk menggunakan proxy Anda juga ...).
sumber
Saya pikir mengkonfigurasi WINHTTP juga akan berfungsi.
Banyak program termasuk Pembaruan Windows mengalami masalah di balik proksi. Dengan mengatur WINHTTP akan selalu memperbaiki masalah seperti ini
sumber