本技巧將向您講述如何編寫可通過代理訪問因特網上的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瀏覽器,您就可能碰到過這種情況。以下是執行認證的方法:
urlconnectionconnection=url.openconnection();
stringpassword="username:password";
stringencodedpassword=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:
urlurl=newurl("ftp://ftp.netscape.com/pub/navigator/3.04/windows/readme.txt");
如果有人有使用其他網際協議代理的例子,我很想看看。
注意:代碼示例(example.java)僅在jdk1.1.4下測試過。
后續技巧!
對于仍在使用jdk1.1.7(配合websphere3.0)的開發人員而言,將proxyhost和proxyport設為系統屬性不起作用;conn.getinputstream()或者返回連接超時,或者是找不到主機路徑。但是,我使用接受host和port為參數的url構造函數解決了這一問題(使用我的代理主機和端口):
publicurl(stringprotocol,stringhost,intport,stringfile).
借助用戶名和口令進行認證的方法不起作用。應將"basic"置于認證字符串的開頭;例如:
stringencodedpassword=base64encode(password);
應該是:
stringencodedpassword="basic"+base64encode(password);
您也不必用一個單獨的程序來進行64位編碼。您可以使用sun.misc.base64encoder()類。下面是完成這兩處改動之后的代碼:
|
下面是使用socks4代理服務器的方法:
system.getproperty("socksproxyset",true);
system.getproperty("socksproxyhost",proxyhostname);
system.getproperty("socksproxyport",proxyport);
usuallytheproxyportforsocks4isport1080
接下來您就可以用socks4進行連接了。
新聞熱點
疑難解答