熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java進階:Java編寫通過代理訪問的應用程序

2013-11-23 19:06:15  來源: Java核心技術 

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

  幾乎所有的公司都十分關注保護自己的內部網絡以防黑客及入竊者一種常見的安全措施是完全斷開與因特網的連接如果黑客們不能連接到您的任何一台機器他們就不能非法進入您的系統這種策略產生的不利副作用是內部用戶無法訪問外部的因特網服務器如Yahoo或JavaWorld為了解決這一問題網絡管理員通常安裝代理服務器實際上代理是安裝於因特網和內部網之間的一種服務用來管理這兩個領域之間的連接代理有助於減少安全性的外部威脅同時還允許內部用戶訪問因特網服務盡管Java使得編寫因特網客戶機不再困難但是如果客戶機不能通過代理則它們毫無用處幸運的是Java使得使用代理支持不再困難如果您知道密訣這就是事實

  將Java和代理結合起來的秘訣即在Java運行時激活特定的系統屬性這些屬性未被寫入正式文件只是作為Java傳說的一部分在Java編程人員中秘傳為了支持代理Java應用程序不僅需要指定代理本身的信息而且需要指定用於認證的用戶信息在開始使用網際協議之前您需要在程序中添加以下幾行代碼

  

  SystemgetProperties()put(proxySettrue); SystemgetProperties()put(proxyHostmyProxyMachineName); SystemgetProperties()put(proxyPort);


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

  

  URLConnectionconnection=urlopenConnection(); Stringpassword=username:password; StringencodedPassword=baseEncode(password); connectionsetRequestProperty(ProxyAuthorizationencodedPassword);


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

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

  FTP代理

  ScottDTaylor提出這個秘訣來處理FTP協議代理

  

  defaultPropertiesput(ftpProxySettrue); defaultPropertiesput(ftpProxyHostproxyhostname); defaultPropertiesput(ftpProxyPort);


  接下來您便可以通過以下代碼使用ftp協議訪問文件URL

  

  URLurl=newURL( ftp:///pub/navigator//windows/readmetxt);


  如果有人有使用其他網際協議代理的例子我很想看看

  注意代碼示例(Examplejava)僅在JDK下測試過

  後續技巧!

  對於仍在使用JDK(配合WebSphere)的開發人員而言將proxyHost和proxyPort設為系統屬性不起作用conngetInputStream()或者返回連接超時或者是找不到主機路徑但是我使用接受Host和Port為參數的URL構造函數解決了這一問題(使用我的代理主機和端口)

  publicURL(StringprotocolStringhostintportStringfile)

  借助用戶名和口令進行認證的方法不起作用應將Basic置於認證字符串的開頭例如

  StringencodedPassword=baseEncode(password);

  應該是

  StringencodedPassword=Basic+baseEncode(password);

  您也不必用一個單獨的程序來進行位編碼您可以使用sunmiscBASEEncoder()類下面是完成這兩處改動之後的代碼

  

  SystemgetProperties()put(proxySettrue); SystemgetProperties()put(proxyHostproxyHost); SystemgetProperties()put(proxyPortproxyPort); StringauthString=userid:password; Stringauth=Basic+newsunmiscBASEEncoder ()encode(authStringgetBytes()); URLurl=newURL(); URLConnectionconn=urlopenConnection(); connsetRequestProperty(ProxyAuthorizationauth);

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

  

  SystemgetProperty(socksProxySettrue); SystemgetProperty(socksProxyHostproxyHostName); SystemgetProperty(socksProxyPortproxyPort); UsuallytheproxyPortforSocksisport


  接下來您就可以用Socks進行連接了


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26278.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.