HttpClient模擬瀏覽器登錄後發起請求(攜帶Cookie發請求)

 

大家都知道 使用httpClient能模擬瀏覽器發起請求,得到想要的反回結果

但在互聯網中存在這樣一種情況,某些資源只有登錄後纔可以查看或下載

例如:百度文庫、部分論壇(只有登錄後纔可以看某些板塊)

 

瀏覽器實現這個效果需要如下幾個步驟:

 

Ø 1請求一個需要登錄的頁面或資源

Ø 2服務器判斷當前的會話是否包含已登錄信息。如果沒有登錄重定向到登錄頁面

Ø 3手工在登錄頁面錄入正確的賬戶信息並提交

Ø 4服務器判斷登錄信息是否正確,如果正確則將登錄成功信息保存到session

Ø 5登錄成功後服務器端給瀏覽器返回會話的SessionID信息保存到客戶端的Cookie

Ø 6瀏覽器自動跳轉到之前的請求地址並攜帶之前的Cookie(包含登錄成功的SessionID

Ø 7服務器端判斷session中是否有成功登錄信息,如果有則將請求的資源反饋給瀏覽器

 

 

 

下面使用HttpClient模擬上述過程,這裏只實現手工發起登錄,並攜帶Cookie發起第二次請求資源的過程。(網上實際有過好多這樣的例子,這裏只是自己寫出來備忘)

 

此處請求的是Iteye的博客主頁,其他地址需要手動構建下URL

 

 

本文是一個的是 httpClient 4.2.5 httpCore 4.2.4  

有這兩個jar

使用maven構建的,需要下載jar包的可以使用添加如下依賴

 

Xml代碼  收藏代碼
  1. <dependency>  
  2.     <groupId>org.apache.httpcomponents</groupId>  
  3.     <artifactId>httpclient</artifactId>  
  4.     <version>4.2.5</version>  
  5. </dependency>  
 

 

沒有maven支持的也可以到apache的網站上去下載,方式有好多種或聯繫我

 

 

下面給出Java代碼 

 

 

 

Java代碼  收藏代碼
  1. package org.jshand.utils.http;  
  2.   
  3. import java.io.FileOutputStream;  
  4.   
  5. import org.apache.http.HttpEntity;  
  6. import org.apache.http.HttpResponse;  
  7. import org.apache.http.client.CookieStore;  
  8. import org.apache.http.client.methods.HttpGet;  
  9. import org.apache.http.client.methods.HttpPost;  
  10. import org.apache.http.impl.client.DefaultHttpClient;  
  11. import org.apache.http.impl.conn.PoolingClientConnectionManager;  
  12. import org.apache.http.util.EntityUtils;  
  13.   
  14. /** 
  15.  * TODO(用一句話描述該文件的作用) 
  16.  *  
  17.  * @title: HttpClientDemo.java 
  18.  * @author zhangjinshan-ghq 
  19.  * @date 2014-6-11 14:59:04 
  20.  */  
  21.   
  22. public class HttpClientDemo  
  23. {  
  24.   
  25.     /** 
  26.      * The main method. 
  27.      *  
  28.      * @param args the arguments 
  29.      * @throws Exception the exception 
  30.      */  
  31.     public static void main(String[] args) throws Exception  
  32.     {  
  33.         getResoucesByLoginCookies();  
  34.     }  
  35.   
  36.     /** 
  37.      * 根據登錄Cookie獲取資源 
  38.      * 一切異常均未處理,需要酌情檢查異常 
  39.      *  
  40.      * @throws Exception 
  41.      */  
  42.     private static void getResoucesByLoginCookies() throws Exception  
  43.     {  
  44.         HttpClientDemo demo = new HttpClientDemo();  
  45.         String username = "XXXXXXXXX";// 登錄用戶  
  46.         String password = "XXXXXXXX";// 登錄密碼  
  47.   
  48.         // 需要提交登錄的信息  
  49.         String urlLogin = "http://www.iteye.com/login?name=" + username + "&password=" + password;  
  50.   
  51.         // 登錄成功後想要訪問的頁面 可以是下載資源 需要替換成自己的iteye Blog地址  
  52.         String urlAfter = "http://314649444.iteye.com/";  
  53.   
  54.         DefaultHttpClient client = new DefaultHttpClient(new PoolingClientConnectionManager());  
  55.   
  56.         /** 
  57.          * 第一次請求登錄頁面 獲得cookie 
  58.          * 相當於在登錄頁面點擊登錄,此處在URL中 構造參數, 
  59.          * 如果參數列表相當多的話可以使用HttpClient的方式構造參數 
  60.          * 此處不贅述 
  61.          */  
  62.         HttpPost post = new HttpPost(urlLogin);  
  63.         HttpResponse response = client.execute(post);  
  64.         HttpEntity entity = response.getEntity();  
  65.         CookieStore cookieStore = client.getCookieStore();  
  66.         client.setCookieStore(cookieStore);  
  67.   
  68.         /** 
  69.          * 帶着登錄過的cookie請求下一個頁面,可以是需要登錄才能下載的url 
  70.          * 此處使用的是iteye的博客首頁,如果登錄成功,那麼首頁會顯示【歡迎XXXX】 
  71.          *  
  72.          */  
  73.         HttpGet get = new HttpGet(urlAfter);  
  74.         response = client.execute(get);  
  75.         entity = response.getEntity();  
  76.   
  77.         /** 
  78.          * 將請求結果放到文件系統中保存爲 myindex.html,便於使用瀏覽器在本地打開 查看結果 
  79.          */  
  80.   
  81.         String pathName = "d:\\myindex.html";  
  82.         writeHTMLtoFile(entity, pathName);  
  83.     }  
  84.   
  85.     /** 
  86.      * Write htmL to file. 
  87.      * 將請求結果以二進制形式放到文件系統中保存爲.html文件,便於使用瀏覽器在本地打開 查看結果 
  88.      *  
  89.      * @param entity the entity 
  90.      * @param pathName the path name 
  91.      * @throws Exception the exception 
  92.      */  
  93.     public static void writeHTMLtoFile(HttpEntity entity, String pathName) throws Exception  
  94.     {  
  95.   
  96.         byte[] bytes = new byte[(int) entity.getContentLength()];  
  97.   
  98.         FileOutputStream fos = new FileOutputStream(pathName);  
  99.   
  100.         bytes = EntityUtils.toByteArray(entity);  
  101.   
  102.         fos.write(bytes);  
  103.   
  104.         fos.flush();  
  105.   
  106.         fos.close();  
  107.     }  
  108.   
  109. }  
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章