熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

編寫支持基於代理的防火牆的Java應用程序

2013-11-15 11:51:47  來源: JSP教程 

  幾乎所有的公司都十分關注保護自己的內部網絡以防黑客及入竊者一種常見的安全措施是完全斷開與因特網的連接如果黑客們不能連接到您的任何一台機器他們就不能非法進入您的系統這種策略產生的不利副作用是內部用戶無法訪問外部的因特網服務器如 Yahoo 或 JavaWorld為了解決這一問題網絡管理員通常安裝代理服務器實際上代理是安裝於因特網和內部網之間的一種服務用來管理這兩個領域之間的連接代理有助於減少安全性的外部威脅同時還允許內部用戶訪問因特網服務盡管 Java 使得編寫因特網客戶機不再困難但是如果客戶機不能通過代理則它們毫無用處幸運的是Java 使得使用代理支持不再困難 如果您知道密訣這就是事實
  
  將 Java 和代理結合起來的秘訣即在 Java 運行時激活特定的系統屬性這些屬性未被寫入正式文件只是作為 Java 傳說的一部分在 Java 編程人員中秘傳為了支持代理Java 應用程序不僅需要指定代理本身的信息而且需要指定用於認證的用戶信息在開始使用網際協議之前您需要在程序中添加以下幾行代碼
  
  SystemgetProperties()put( proxySet true );
  SystemgetProperties()put( proxyHost myProxyMachineName );
  SystemgetProperties()put( proxyPort );
  
  上面的第一行通知 Java 您要通過代理進行連接第二行指定代理所在的機器第三行指定代理監聽的端口有些代理在授權用戶訪問因特網之前要求用戶輸入用戶名和口令如果您使用位於防火牆之內的 Web 浏覽器您就可能碰到過這種情況以下是執行認證的方法
  
  URLConnection connection = urlopenConnection();
  String password = username:password;
  String encodedPassword = baseEncode( password );
  connectionsetRequestProperty( ProxyAuthorization encodedPassword );
  
  這段代碼的思想是您必須調整 HTTP 標頭以發出用戶信息這是通過調用 setRequestProperty() 來實現的這種方法允許您在發出請求之前處理 HTTP 標頭HTTP 要求用 base 對用戶名和口令進行編碼幸運的是有一組公用域 API它們將代您執行編碼(請參閱參考資源部分)
  
  如您所見在 Java 應用程序中加入代理支持並不需要做多少工作有了現在的知識再做一點研究(您必須查明您的代理是如何處理您感興趣的協議以及如何進行用戶認證的)您就能用其他協議實現代理
  
  FTP 代理
  Scott D Taylor 提出這個秘訣來處理 FTP 協議代理
  
  defaultPropertiesput( ftpProxySet true );
  defaultPropertiesput( ftpProxyHost proxyhostname );
  defaultPropertiesput( ftpProxyPort );
  
  接下來您便可以通過以下代碼使用 ftp 協議訪問文件 URL
  
  URL url = new URL(ftp:///pub/navigator//windows/readmetxt );
  
  如果有人有使用其他網際協議代理的例子我很想看看
  
  注意 代碼示例 (Examplejava) 僅在 JDK 下測試過
  
  後續技巧! 
  對於仍在使用 JDK (配合 WebSphere )的開發人員而言將 proxyHost 和 proxyPort 設為系統屬性不起作用conngetInputStream() 或者返回連接超時或者是找不到主機路徑但是我使用接受 Host 和 Port 為參數的 URL 構造函數解決了這一問題(使用我的代理主機和端口)
  
  public URL(String protocol String host int port String file)
  
  借助用戶名和口令進行認證的方法不起作用應將 Basic 置於認證字符串的開頭例如
  
  String encodedPassword = baseEncode( password );
  
  應該是
  
  String encodedPassword = Basic + baseEncode( password );
  
  您也不必用一個單獨的程序來進行 位編碼您可以使用 sunmiscBASEEncoder() 類下面是完成這兩處改動之後的代碼
  
  SystemgetProperties()put(proxySet true);
  SystemgetProperties()put(proxyHost proxyHost);
  SystemgetProperties()put(proxyPort proxyPort);
  String authString = userid:password;
  String auth = Basic + new sunmiscBASEEncoder
  ()encode(authStringgetBytes());
  URL url = new URL();
  URLConnection conn = urlopenConnection();
  connsetRequestProperty(ProxyAuthorization auth);
  
  下面是使用 socks 代理服務器的方法
  
  SystemgetProperty(socksProxySet true);
  SystemgetProperty(socksProxyHost proxyHostName);
  SystemgetProperty(socksProxyPort proxyPort);
  Usually the proxyPort for Socks is port
  
  接下來您就可以用 Socks 進行連接了
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19767.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.