日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用ApacheHttpClient突破J2EE站點認證

J2EE 站點認證簡介

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團企業(yè)網(wǎng)站建設(shè)等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了滄源免費建站歡迎大家使用!

出于安全性的需要和用戶授權(quán)管理的考慮,常見的 J2EE 站點對特定資源都會加入認證/授權(quán)機制。例如一個公網(wǎng)上的論壇,一個只對特定用戶開放的 RSS 或 Atom Feed,這些資源都必須在確信訪問者為被授權(quán)用戶時才能向訪問者開放。為了實現(xiàn)這樣的功能,J2EE 站點通常會采用某種站點認證機制,其中常見的有 HTTP Basic 認證和 J2EE Form-Based 認證。

HTTP Basic 認證

HTTP Basic 認證是 HTTP 認證協(xié)議(rfc2617)所定義的標準認證方式。要求 HTTP Basic 認證的服務器會在客戶端訪問受保護資源時向客戶端發(fā)出請求,要求客戶端上傳用戶名和密碼對。服務器在收到用戶名/密碼并驗證通過后,才將保護資源的內(nèi)容返回給客戶端。它的工作機制如下圖:

圖 1. HTTP Basic 認證原理

由于是 HTTP 規(guī)范,因而常見的瀏覽器,如 Internet Explorer,Mozilla Firefox,在 步驟 2 中收到服務器對用戶名和密碼的請求時會彈出認證對話框,供用戶輸入用戶名/密碼。

圖 2. Firefox 在收到步驟 2 中請求時彈出的用戶名/密碼輸入框

HTTP Basic 認證方式使用 base64 編碼方式傳送用戶名和密碼,而 base64 僅僅是一種公開的編碼格式而非加密措施,因而如果信道本身不使用 SSL 等安全協(xié)議,用戶密碼較容易被截獲。

J2EE Form-Based 認證

Form-Based 認證不同于 HTTP Basic 認證,它是 J2EE 對于認證方式的一種擴展。它使用自定義的 HTML 表單(通常為 login.jsp)作為輸入用戶名和密碼的用戶界面,最終將用戶在表單上填入的用戶名/密碼提交至服務器。它的工作機制如下:

圖 3. Form-Based 認證原理

Form-Based 認證方式在 J2EE 站點中更為常見。這一方面是由于它提供了自定義的用戶名密碼輸入界面;另一方面它的傳輸也更為安全,通常情況下 login.jsp 會被配置為需要使用 SSL 信道訪問,這樣在步驟 2、3 中對用戶名和密碼的傳送就被安全信道所保護,而較難被非法截取。

Apache HttpClient 認證功能簡介

Apache HttpClient 是 Apache 開源組織提供的純 Java 實現(xiàn)的 HTTP 開源包。它能模擬各類 HTTP 客戶端所需功能,例如 HTTP/HTTPS 連接,GET/PUT 請求,甚至提供了超時重試的功能。

HttpClient 也提供了對標準 HTTP 認證的接口,在最新的 HttpClient 3.1 中,支持的認證方式有:

  • Basic 認證:即前面提到的 rfc2716 規(guī)范中定義的 HTTP Basic 認證方式。
  • Digest 認證:一種基于摘要的更為安全的認證協(xié)議,雖然它的應用沒有 Basic 認證方式廣泛。
  • NTLM 認證:微軟制定的認證協(xié)議規(guī)范,然而此項標準的細節(jié)卻并不公開。

我們可以注意到 Form-Based 認證并不在其中,這是因為 Form-Based 認證方式并非 HTTP 協(xié)議標準,而是 J2EE 提供的一種特殊的認證方式,因而開發(fā)者需要在 HttpClient 基礎(chǔ)上另行開發(fā)適合 Form-Based 認證的方案。

使用 Apache HttpClient 通過 HTTP Basic 認證

由于 HttpClient 內(nèi)置支持 HTTP Basic 認證方式,因而使用 HttpClient 通過 HTTP Basic 認證的步驟顯得較為簡單。

  1. 為 HttpClient 的狀態(tài)對象添加用戶名/密碼對??梢宰⒁獾皆?setCredentials 方法中的另一個參數(shù)為 AuthScope 對象。事實上我們添加的每個用戶名/密碼對都與一個 AuthScope 對象相關(guān)聯(lián)。AuthScope 對象確定了此用戶名/密碼對的適用站點,在示例中所給出的用戶名/密碼對將只適用于 www.sample.com 位于 80 端口上的資源。HttpClient 在與其他站點交互時將不會使用此用戶名/密碼對,這樣有效地防止了機密數(shù)據(jù)被傳送至不必要的站點。
  2. 開啟 HttpClient 提供的占先式(Preemptive)認證功能。開啟了這個功能后,HttpClient 對于那些處在之前請求過的URI空間范圍內(nèi)的資源,會主動地隨請求一起向服務器發(fā)送 Basic 認證數(shù)據(jù),而不是等待服務器返回是否需要認證的響應后再提交認證。在多數(shù)情況下,能夠減少請求-響應傳遞的次數(shù),從而間接提高了服務器的響應能力。值得注意的是在這種情況下必須在 AuthScope 對象中明確指定適用站點,以避免向不相關(guān)的站點泄漏敏感數(shù)據(jù)。
  3. 創(chuàng)建 GetMethod 對象,此對象將使用 GET 方式對保護資源發(fā)出 HTTP 請求。
  4. setDoAuthentication(true) 語句將告知 HttpClient 在服務器端發(fā)回需要認證的請求后,自動將我們在步驟 1 中設(shè)置的用戶名/密碼對發(fā)送至服務器,以完成認證過程。

執(zhí)行 GET 請求,獲取和處理受保護資源的內(nèi)容。

清單 1. Basic 認證示例

 
 
 
 
  1.                 
  2. HttpClient client = new HttpClient();
  3.     
  4. // 1
  5. client.getState().setCredentials(
  6.     new AuthScope("www.sample.com", 80, AuthScope.ANY_REALM),
  7.     new UsernamePasswordCredentials("username", "password")
  8. );
  9.          
  10. // 2
  11. client.getParams().setAuthenticationPreemptive(true);
  12. // 3
  13. GetMethod get = new GetMethod("http://www.sample.com/protected.html");
  14. // 4
  15. get.setDoAuthentication( true );
  16. try {
  17.     // 5
  18.     int status = client.executeMethod( get );
  19.     // process the content from the response
  20.     …
  21. } finally {
  22.     get.releaseConnection();
  23. }

由于 Basic 認證方式直接向服務器發(fā)送未經(jīng)加密的用戶名/密碼對,導致這些敏感數(shù)據(jù)很容易在網(wǎng)絡(luò)傳輸過程中被截取,因此安全性很低。所幸 HttpClient 對基于安全套接字層(SSL)的 HTTP 協(xié)議(HTTPS)提供了足夠的支持,而且使用起來也很簡單。不過之前需確保本地機器已經(jīng)安裝好 JSSE(Sun 提供的 JDK 1.4 及之后的版本已集成 JSSE)。

使用 HttpClient 進行標準的 SSL 連接對用戶來說是透明的。參照清單 1,用戶只需用符合 HTTPS 協(xié)議的 URL 作為參數(shù)生成 GetMethod 對象即可。除此之外,HttpClient 還允許用戶定制 SSL 使得客戶端程序能夠自動接受不同類型的證書。

利用 HttpClient 實現(xiàn)一個自定義的 SSL 協(xié)議包括以下 3 個關(guān)鍵步驟:

  1. 定制一個實現(xiàn)了 org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory 接口的工廠類。這個工廠類的作用是開啟一個與服務器通訊的 Socket 并進行必需的初始化動作。關(guān)于實現(xiàn)該接口的具體細節(jié),HttpClient 項目的主頁上有詳細的代碼實例和注釋說明。
  2. 利用之前創(chuàng)建的工廠類對象、HTTPS 協(xié)議名稱和默認端口號實例化一個新的 org.apache.commons.httpclient.protocol.Protocol 對象。
  3. 注冊這個自定義的 Protocol 對象使其與某個協(xié)議名綁定,當 HttpClient 處理此類協(xié)議時,將默認調(diào)用這個自定義 Protocol 對象。

清單 2. 在 HttpClient 中自定義 SSL 示例

 
 
 
 
  1. // 1
  2. SecureProtocolSocketFactory sampleSSLSocketFactory = new SampleSSLSocketFactory();
  3.     
  4. // 2
  5. Protocol httpsProtocol = new Protocol("https", sampleSSLSocketFactory, 443);
  6. // 3
  7. Protocol.registerProtocol("https", httpsProtocol);
  8. HttpClient client = new HttpClient();
  9. client.getState().setCredentials(
  10.     new AuthScope("www.sample.com", 80, AuthScope.ANY_REALM),
  11.     new UsernamePasswordCredentials("username", "password")
  12. );
  13.          
  14. // Request the protected resource via SSL
  15. GetMethod get = new GetMethod("https://www.sample.com/protected.html");
  16. get.setDoAuthentication( true );
  17. try {
  18.     int status = client.executeMethod( get );
  19.     // process the content from the response
  20.     …
  21. } finally {
  22.     get.releaseConnection();
  23. }

使用 Apache HttpClient 通過 Form-Based 認證

Form-Based 認證相對 HTTP Basic 認證而言過程較為復雜,需要開發(fā)者記錄下相關(guān)的 cookie 信息和部分 header 字段并多次向站點發(fā)出請求。它的大致原理如下:

注意:不同的應用可能有不同的配置方式,開發(fā)者可以先在瀏覽器中手動訪問受保護資源,獲取 login.jsp。進行分析后即可獲知對應的認證服務資源 j_security_check 的位置以及對應的用戶名與密碼在表單中的字段。

假定我們需要訪問的受保護資源為 http://www.sample.com/sampleApp/sample.rss。首先我們需要向此保護資源發(fā)出請求。而由 Form-Based 認證原理一節(jié)中可知,J2EE 服務器會將此請求重定向至 login.jsp。如果仔細分析 login.jsp 我們能發(fā)現(xiàn)它僅僅是一個 HTML 表單,其中有兩個字段 j_username 和 j_password 分別記錄用戶名和密碼,而提交的目標則是 j_security_check。通常情況下,J2EE 構(gòu)架會在每個站點應用的根節(jié)點定義一個 j_security_check 的資源。而我們的站點的應用程序根(Application Root)為 sampleApp。因而,通過將用戶名,密碼以及相關(guān) cookie 和 header 字段以 POST 方式發(fā)送至 http://www.sample.com/sampleApp/j_security_check 即可通過站點認證。在通過站點認證后,服務器端將給出一個新的重定向,通常它將指向了用戶最初試圖訪問的受保護資源(本例中也就是 http://www.sample.com/sampleApp/sample.rss)。我們只需要再次創(chuàng)建訪問對象向此資源發(fā)出請求即可獲得其內(nèi)容。

以下給出一個示例:

清單 3. Form-Based 認證示例

 
 
 
 
  1.                 
  2. HttpClient client = new HttpClient();
  3. client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
  4. // 1
  5. GetMethod authget = new GetMethod("httpwww.sample.comsampleAppsample.rss");
  6. try {
  7.     client.executeMethod(authget);
  8. }
  9. catch (HttpException httpe) {
  10.     httpe.printStackTrace();
  11. }
  12. catch (IOException ioe) {
  13.     ioe.printStackTrace();
  14. }
  15. // 2
  16. NameValuePair[] data = new NameValuePair[2];
  17. data[0] = new NameValuePair("j_username", username);
  18. data[1] = new NameValuePair("j_password", password);
  19. PostMethod authpost = new PostMethod("http://www.sample.com/sampleApp/j_security_check");
  20. authpost.setRequestBody(data);
  21. // 3
  22. Header hCookie = authget.getRequestHeader("Cookie");
  23. Header hHost = authget.getRequestHeader("Host");
  24. Header hUserAgent = authget.getRequestHeader("User-Agent");
  25. if (hCookie == null || hHost == null || hUserAgent == null) {
  26.     return null;
  27. }
  28. authpost.setRequestHeader(hCookie);
  29. authpost.setRequestHeader(hHost);
  30. authpost.setRequestHeader(hUserAgent);
  31. authget.releaseConnection();
  32. try {
  33.     client.executeMethod(authpost);
  34.     // 4
  35.     Header header = authpost.getResponseHeader("location");
  36.     if (header != null) {
  37.         String newuri = header.getValue(); 
  38.         GetMethod redirect = new GetMethod(newuri);
  39.         client.executeMethod(redirect); 
  40.         // process the content from the response
  41.         redirect.releaseConnection();            
  42.     }
  43. } catch (HttpException httpe) {
  44.     httpe.printStackTrace();
  45.     return null;
  46. } catch (IOException ioe) {
  47.     ioe.printStackTrace();
  48.     return null;
  49. }
  50. authpost.releaseConnection();

其中各個步驟解釋如下:

  1. 使用 GET 方式請求 sample.rss。服務器收到連接后將在響應中給出連接信息,HttpClient 在接收到響應后會將其保存至 cookie 中。
  2. 準備第二次對 j_security_check 的連接,將用戶名和密碼填入新的 POST 請求的正文。
  3. 將 cookie 和部分 header 字段拷貝至新請求的報頭中,并發(fā)送請求。
  4. 從認證成功的響應中獲取重定向,并對重定向指向的資源發(fā)出請求,獲取并處理內(nèi)容。

小  結(jié)

隨著 Web 2.0 時代的到來,Web 站點的數(shù)據(jù)和內(nèi)容顯得愈加重要。而為了收集這些數(shù)據(jù),人們需要利用計算機本身的搜集能力,通過后臺請求,而不是瀏覽器交互的方式去獲取站點的數(shù)據(jù)。而商業(yè)站點中普遍存在的認證/授權(quán)機制顯然成為了開發(fā)此類數(shù)據(jù)收集程序的一道屏障。Apache HttpClient 根據(jù)這些需求,提供了多種 HTTP 認證機制的實現(xiàn)方案。開發(fā)人員也可以利用 HttpClient 強大的底層功能,設(shè)計特定方案以通過 J2EE 站點的認證體系。


分享題目:使用ApacheHttpClient突破J2EE站點認證
網(wǎng)站URL:http://www.dlmjj.cn/article/dhjhohs.html