国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

開啟Java對代理服務器和HTTP驗證的支持

2019-11-18 12:44:54
字體:
來源:轉載
供稿:網友

  編寫能夠訪問Web頁面的java應用程序是不難的,這要感謝Java核心庫對其所提供的良好支持。但是,說得更加全面一點,任何這樣的應用程序都必須支持代理服務器和HTTP驗證。幸運的是,從1.2版開始,Java就對驗證提供了本地支持。只用小小的努力,你就能給先前的版本加上類似的支持。
  
  使用代理服務器
   
  從技術上講,代理服務器只是一個接受請求并把這些請求轉發(fā)到最終目的地或者另一個代理服務器的代理程序。代理服務器的典型應用是實現緩沖和防火墻。
  
  在HTTP這一層次,一個穿過代理服務器的請求和一般的請求沒有很大的區(qū)別。一般來說,這個請求被送到代理服務器而不是真正的目的地,而且地址被完全記錄下來,以便于代理服務器能夠找到目標主機。
  
  Java以非凡的系統屬性為代理服務器提供支持。你所需要做的就是把http.PRoxyHost屬性設置到代理服務器地址,把http.proxyPort設置到代理服務器端口。例如,假如在地址proxy.mycompany.com:8132有一個代理服務器,以下這段代碼使用這個代理服務器配置了Java的HTTP協議:
  
  System.getProperties().setProperty( "http.proxyHost", "proxy.mycompany.com" );
  System.getProperties().setProperty( "http.proxyPort", "8132" );
  
  對于簡單的情況這個支持就夠了。但是有些代理,尤其是防火墻,被配置成需要驗證,以答應請求通過。在這種情況下,就必須提供驗證支持,這就引出了HTTP驗證。
  
  HTTP驗證
  HTTP協議支持對資源的保護,所以必須提供一個合適的驗證方法來訪問這些資源。當一個請求要對這樣的資源進行訪問,Web服務器會回應一個401(未經授權的)錯誤碼(見RFC2616),在這種情況下,包含了一個指定方案和域的WWW驗證報頭。
  
  這個方案定義了提供權限的方法。目前指定了兩種策略:基本的和摘要的(見RFC2617)。我會把重點放在基本策略上,因為它更普遍也更輕易實現,盡管摘要策略更加強大且提供更高的安全性。
  
  域
  域是一個定義相同主機內受保護區(qū)間(一組需要保護的資源)的任意串。單一的主機可以有多個域,相同域內的所有資源都共享相同權限——也就是說,假如對給定資源請求的權限是合法的,那么在相同的區(qū)域內,對其他資源的任何后來的請求也必須是合法的。
  
  假設你要訪問某個Web服務器上“Protected Territory”內的一個受保護資源,那么會應將包含以下報頭(假設Web服務器使用的是基本的驗證):
  
  WWW-Authenticate: Basic realm="Protected Territory"
  
  你必須重新發(fā)出請求,并包括指定了合法用戶名和密碼的驗證報頭。如何提取用戶名和密碼則是應用程序的工作了。例如瀏覽器通常使用顯示主機和域的對話框來要求輸入用戶名和密碼。
  
  驗證報頭必須以:的形式,提供所使用的驗證方案、用戶名和密碼(一個base64編碼串,見RFC2045)。所以,假如用戶名是Alladin(阿拉丁),密碼是“open sesame(芝麻開門)”,那么要送出的報頭就應該是:
  
  Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
  
  代理服務器也是這樣的,除非代理服務器回應一個407(需要代理服務器驗證)錯誤碼和代理服務器驗證報頭,這個報頭是回應一個不包含合法權限的請求的。權限必須在請求的代理服務器驗證報頭里提供。
  
  代理服務器要在應用程序的配置里設定,用戶名和密碼也是一樣的。使用這個方法,應用程序就不用等待要求必要信息的407錯誤碼,也不用重新發(fā)送請求了。
   Java里的HTTP驗證
   
  在URLConnection類里,Java提供了實現HTTP驗證所需的一切。在對服務器的連接打開后(在調用了connect方法后),報頭可通過getHeaderField(String)方法訪問到,這個方法在給定名字時將報頭的值作為一個串返回。
  
  所以在發(fā)送一個請求后,使用getHeaderField方法就可以獲取WWW驗證報頭。假如這個方法返回的是空值,那么這個報頭就沒有被使用,這個請求不需要授權。否則就解析返回的值,獲取域,并使用這個值獲取用戶名和密碼。然后重發(fā)請求,這一次使用setRequestProperty方法設置驗證報頭。
  
  你可以不停地重復這一過程,直到授權被許可或者用戶中止了操作。你也可以保存用戶名和密碼以備以后在相同的域內為請求提供權限。根據HTTP驗證的規(guī)范,所有對相同或者更深層次的相同路徑的請求應該被認為是相同區(qū)域內的一部分。
  
  盡管標準的Java類沒有提供對base64的支持,但是要實現base63不是一件困難的事。有好幾個公開可用的工具,見Listing A。
  
  你可以以同樣的方式為代理服務器設置權限。使用setRequestProperty方法在每個請求里設置代理服務器驗證報頭就行了。
  
  要使為Java應用程序加上HTTP驗證更加輕易些,我編寫了HttpGet類(Listing B),它對代理服務器也提供了支持。完整的API見表A:
  
  表A
  開啟Java對代理服務器和HTTP驗證的支持
  最重要的方法是doGet,它對一個URL發(fā)出HTTP GET請求,返回一個連接的URLConnection對象。它使用authorize方法來取得指定域的用戶名和密碼。缺省的方法是使用一個對話框來要求輸入這個信息。假如你需要定制一個方法,只用細分HttpGet并取代authorize方法就行了。假如相同的區(qū)域要被再次訪問,權限可以被緩沖以供再次使用。
  
  Listing C是一個簡單的例子,這個例子說明了使用HttpGet類獲取指定URL(使用命令行指定)的內容并將其打印到標準輸出的過程。
  
  驗證和Java 1.2
  Java 1.2以及更高的版本以類驗證器的形式為驗證提供了本地支持。你所需要做的只是將其細分并取代getPassWordAuthentication方法。這個方法必須獲取用戶名和密碼,并將它們作為一個PasswordAuthentication對象返回。
  
  你還必須使用Authenticator.setDefault方法為你驗證器工具的實例進行注冊。完成注冊后,每當碰到受保護資源Java就會調用getPasswordAuthentication方法。
  
  這個方法的一個好處是Java會治理所有的底層細節(jié)。除此之外,驗證器不僅僅局限于HTTP驗證,還能用于其他任何協議。不足之處在于它只在Java 1.2里有。Listing D使用的是Listing C的例子,但是使用了驗證器的類。
  
  結論
  對代理服務器和HTTP驗證的支持是任何應用程序處理Web頁面時所必需的。正如我們在這里看到的,Java 1.2對這種驗證提供了本地支持,只用一點工作,你就能在任何版本的Java里加入這樣的支持。
  
  我的方法說明的只是這個過程的基本點,還有很大空間可供改善。(你可以在此找到本文所設計程序的源代碼。)例如,你也許想要增加對其他類型請求的支持,但是這個版本的只能用于GET。在今后的文章里,我會重提這個問題,并討論如何對其改進。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 金寨县| 家居| 延寿县| 太仆寺旗| 顺平县| 通渭县| 尼勒克县| 马尔康县| 岐山县| 句容市| 平凉市| 新化县| 马关县| 思南县| 威信县| 阳曲县| 诸城市| 酉阳| 册亨县| 托克托县| 庄浪县| 临沧市| 三河市| 新邵县| 武邑县| 德安县| 云安县| 清镇市| 巴青县| 璧山县| 临武县| 红桥区| 金华市| 巴林左旗| 本溪| 阿坝县| 寻甸| 肃北| 深泽县| 视频| 沙雅县|