如果我這樣做...如何讓HttpURLConnection使用代理?
conn = new URL(urlString).openConnection();
System.out.println("Proxy? " + conn.usingProxy());
它打印
Proxy? false
的問題是,我身後的代理。 JVM從Windows獲取代理信息的位置?我如何設置?我的所有其他應用似乎都非常滿意我的代理。
如果我這樣做...如何讓HttpURLConnection使用代理?
conn = new URL(urlString).openConnection();
System.out.println("Proxy? " + conn.usingProxy());
它打印
Proxy? false
的問題是,我身後的代理。 JVM從Windows獲取代理信息的位置?我如何設置?我的所有其他應用似乎都非常滿意我的代理。
由於Java 1.5,你也可以傳遞一個java.net.Proxy實例的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);
如果你的代理需要身份驗證,它會給你響應407
在這種情況下,您需要下列代碼:
Authenticator authenticator = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return (new PasswordAuthentication("user",
"password".toCharArray()));
}
};
Authenticator.setDefault(authenticator);
這是相當容易從互聯網上回答。設置系統屬性http.proxyHost
和http.proxyPort
。您可以使用System.setProperty()
或命令行使用-D
語法來執行此操作。
設置以下你之前的openConnection,
System.setProperty("http.proxyHost", "host");
System.setProperty("http.proxyPort", "port_number");
如果代理需要身份驗證,
System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");
我實際上認爲「http.proxyUser」和「http.proxyPassword」不再受支持 有關更多詳細信息,請參閱http://stackoverflow.com/questions/120797/how-do-i-set-the-proxy-to-be-used-by-the-jvm。 – p3t0r 2009-10-29 20:19:39
代理通過兩個系統屬性的支持:http.proxyHost和把http.proxyPort。它們必須分別設置爲代理服務器和端口。下面簡單的例子說明吧:
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'commons-httpclient'相比,使用最新的Java方法的主要區別是什麼?由於Java支持代理和身份驗證(正如你在這裏提到的http://stackoverflow.com/questions/1626549/authenticated-http-proxy-with-java),對於簡單的情況(如從公共HTTP服務器檢索一個文件),沒有有理由使用Apache庫。你的建議是什麼? – 2010-03-04 20:18:51
@dma_k我同意你的看法,對於你所描述的簡單用例我不會使用第三方庫。 – 2010-03-04 21:02:41
你知道如何支持nonProxyHosts嗎?我看到我的設備支持它,但不知道如何讓我的應用程序處理它。 – RiRomain 2016-11-11 09:58:25
您還可以設置
-Djava.net.useSystemProxies=true
在Windows和Linux這將使用系統設置,因此您不必重複自己(DRY)
http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html#Proxies
經批准的答案會工作。 ..如果你知道你的代理主機和端口=)。但是,如果你正在尋找的代理主機和端口下面的步驟應幫助
如果自動配置代理給出:然後
1>打開IE(或任何瀏覽器)
2>通過IE-> Tools-> internet 選項 - >連接 - >局域網設置 - >獲取地址並在url中輸入url地址,例如:如 http://autocache.abc.com/並輸入,文件將以 .pac格式下載,保存到桌面
3> textpad打開.pac文件識別代理:
在你的編輯器,它會是這樣的:
回報「代理Web-proxy.ind。abc.com:8080; PROXY proxy.sgp.abc.com:8080" ;
bekur一旦你的主機和端口是流行在這個和你的好去
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("web-proxy.ind.abc.com", 8080));
URLConnection connection = new URL(url).openConnection(proxy);
對於Java 1.8及更高版本,您必須設置-Djdk.http.auth.tunneling.disabledSchemes=
以使用基本授權使用https處理代理
關於此的背景信息在https://stackoverflow.com/questions/41806422/java-web-start-unable-to-tunnel-through-proxy-since-java-8-update-111上討論 – U880D 2018-03-09 07:50:39
我們可以通過它提供代理用戶名和代理密碼。 – Xolve 2010-07-04 10:15:41
正是我在找的東西。然而,我不小心點擊downvote複製/粘貼,只是注意到太遲而無法撤消它。抱歉。 – 2013-06-06 20:59:00
如果您對不同的代理有不同的用戶名/密碼對,該怎麼辦?調用一個靜態方法來設置默認的Authenticator並不理想,這比設置sys屬性方法好不了多少.. – javaPhobic 2015-04-30 00:56:50