Java中HttpURLConnection使用代理服務器

Properties prop = System.getProperties();
// 設置http訪問要使用的代理服務器的地址
prop.setProperty("http.proxyHost", "代理服務器地址");
// 設置http訪問要使用的代理服務器的端口
prop.setProperty("http.proxyPort", "代理服務器的端口");
// 設置http訪問要使用的代理服務器的用戶名
prop.setProperty("http.proxyUser", "用戶名");
// 設置http訪問要使用的代理服務器的密碼
prop.setProperty("http.proxyPassword", "密碼");

用Java編寫經過代理訪問的應用程序 java

  本技巧將向您講述如何編寫可經過代理訪問因特網上的Web服務器的Java應用程序。在Java應用程序中加入代理支持只需額外編寫幾行代碼,且不依賴任何安全性「漏洞」。 編程

  幾乎全部的公司都十分關注保護本身的內部網絡,以防黑客及入竊者。一種常見的安全措施是徹底斷開與因特網的鏈接。若是黑客們不能鏈接到您的任何一臺機器,他們就不能非法進入您的系統。這種策略產生的不利反作用是,內部用戶沒法訪問外部的因特網服務器,如Yahoo或JavaWorld。爲了解決這一問題,網絡管理員一般安裝「代理服務器」。實際上,代理是安裝於因特網和內部網之間的一種服務,用來管理這兩個領域之間的鏈接。代理有助於減小安全性的外部威脅,同時還容許內部用戶訪問因特網服務。儘管Java使得編寫因特網客戶機再也不困難,可是若是客戶機不能經過代理,則它們毫無用處。幸運的是,Java 使得使用代理支持再也不困難--若是您知道密訣,這就是事實。 瀏覽器

  將Java和代理結合起來的祕訣即在Java運行時激活特定的系統屬性。這些屬性未被寫入正式文件,只是做爲Java傳說的一部分在Java編程人員中祕傳。爲了支持代理,Java應用程序不只須要指定代理自己的信息,並且須要指定用於認證的用戶信息。在開始使用網際協議以前,您須要在程序中添加如下幾行代碼: 安全

System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost","myProxyMachineName");
System.getProperties().put("proxyPort","85");

  上面的第一行通知Java您要經過代理進行鏈接,第二行指定代理所在的機器,第三行指定代理監聽的端口。有些代理在受權用戶訪問因特網以前,要求用戶輸入用戶名和口令。若是您使用位於防火牆以內的Web瀏覽器,您就可能碰到過這種狀況。如下是執行認證的方法: 服務器

URLConnection connection=url.openConnection();
String password="username:password";
String encodedPassword=base64Encode(password);
connection.setRequestProperty("Proxy-Authorization",encodedPassword);

  這段代碼的思想是,您必須調整HTTP標頭以發出用戶信息。這是經過調用setRequestProperty()來實現的。這種方法容許您在發出請求以前處理HTTP標頭。HTTP要求用base64對用戶名和口令進行編碼。幸運的是,有一組公用域API,它們將代您執行編碼(請參閱參考資源部分)。 網絡

  如您所見,在Java應用程序中加入代理支持並不須要作多少工做。有了如今的知識,再作一點研究(您必須查明您的代理是如何處理您感興趣的協議以及如何進行用戶認證的),您就能用其餘協議實現代理。 函數

  FTP代理 測試

  ScottD.Taylor提出這個祕訣來處理FTP協議代理: 編碼

defaultProperties.put("ftpProxySet","true");
defaultProperties.put("ftpProxyHost","proxy-host-name");
defaultProperties.put("ftpProxyPort","85");

  接下來您即可以經過如下代碼使用"ftp"協議訪問文件URL: url

URLurl = newURL("

  若是有人有使用其餘網際協議代理的例子,我很想看看。

  注意:代碼示例(Example.java)僅在JDK1.1.4下測試過。

  後續技巧!

  對於仍在使用JDK1.1.7(配合WebSphere3.0)的開發人員而言,將proxyHost和proxyPort設爲系統屬性不起做用;conn.getInputStream()或者返回鏈接超時,或者是找不到主機路徑。可是,我使用接受Host和Port爲參數的URL構造函數解決了這一問題(使用個人代理主機和端口):

public URL(Stringprotocol, Stringhost, intport, Stringfile).

  藉助用戶名和口令進行認證的方法不起做用。應將"Basic"置於認證字符串的開頭;例如:

String encodedPassword = base64Encode(password);

  應該是:

String encodedPassword = "Basic"+base64Encode(password);

  您也沒必要用一個單獨的程序來進行64位編碼。您可使用sun.misc.BASE64Encoder()類。下面是完成這兩處改動以後的代碼:

System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost",proxyHost);
System.getProperties().put("proxyPort",proxyPort);
String authString="userid:password";
String auth = "Basic" + newsun.misc.BASE64Encoder().encode(authString.getBytes());
URL url = newURL("
URLConnection conn = url.openConnection();
conn.setRequestProperty("Proxy-Authorization",auth);

  下面是使用socks4代理服務器的方法:

System.getProperty("socksProxySet",true);
System.getProperty("socksProxyHost",proxyHostName);
System.getProperty("socksProxyPort",proxyPort);

Usually the proxy Port for Socks4 is port 1080

  接下來您就能夠用Socks4進行鏈接了。

相關文章
相關標籤/搜索