大家都知道 使用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包的可以使用添加如下依賴
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.2.5</version>
- </dependency>
沒有maven支持的也可以到apache的網站上去下載,方式有好多種或聯繫我
下面給出Java代碼
- package org.jshand.utils.http;
- import java.io.FileOutputStream;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.client.CookieStore;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.apache.http.impl.conn.PoolingClientConnectionManager;
- import org.apache.http.util.EntityUtils;
- /**
- * TODO(用一句話描述該文件的作用)
- *
- * @title: HttpClientDemo.java
- * @author zhangjinshan-ghq
- * @date 2014-6-11 14:59:04
- */
- public class HttpClientDemo
- {
- /**
- * The main method.
- *
- * @param args the arguments
- * @throws Exception the exception
- */
- public static void main(String[] args) throws Exception
- {
- getResoucesByLoginCookies();
- }
- /**
- * 根據登錄Cookie獲取資源
- * 一切異常均未處理,需要酌情檢查異常
- *
- * @throws Exception
- */
- private static void getResoucesByLoginCookies() throws Exception
- {
- HttpClientDemo demo = new HttpClientDemo();
- String username = "XXXXXXXXX";// 登錄用戶
- String password = "XXXXXXXX";// 登錄密碼
- // 需要提交登錄的信息
- String urlLogin = "http://www.iteye.com/login?name=" + username + "&password=" + password;
- // 登錄成功後想要訪問的頁面 可以是下載資源 需要替換成自己的iteye Blog地址
- String urlAfter = "http://314649444.iteye.com/";
- DefaultHttpClient client = new DefaultHttpClient(new PoolingClientConnectionManager());
- /**
- * 第一次請求登錄頁面 獲得cookie
- * 相當於在登錄頁面點擊登錄,此處在URL中 構造參數,
- * 如果參數列表相當多的話可以使用HttpClient的方式構造參數
- * 此處不贅述
- */
- HttpPost post = new HttpPost(urlLogin);
- HttpResponse response = client.execute(post);
- HttpEntity entity = response.getEntity();
- CookieStore cookieStore = client.getCookieStore();
- client.setCookieStore(cookieStore);
- /**
- * 帶着登錄過的cookie請求下一個頁面,可以是需要登錄才能下載的url
- * 此處使用的是iteye的博客首頁,如果登錄成功,那麼首頁會顯示【歡迎XXXX】
- *
- */
- HttpGet get = new HttpGet(urlAfter);
- response = client.execute(get);
- entity = response.getEntity();
- /**
- * 將請求結果放到文件系統中保存爲 myindex.html,便於使用瀏覽器在本地打開 查看結果
- */
- String pathName = "d:\\myindex.html";
- writeHTMLtoFile(entity, pathName);
- }
- /**
- * Write htmL to file.
- * 將請求結果以二進制形式放到文件系統中保存爲.html文件,便於使用瀏覽器在本地打開 查看結果
- *
- * @param entity the entity
- * @param pathName the path name
- * @throws Exception the exception
- */
- public static void writeHTMLtoFile(HttpEntity entity, String pathName) throws Exception
- {
- byte[] bytes = new byte[(int) entity.getContentLength()];
- FileOutputStream fos = new FileOutputStream(pathName);
- bytes = EntityUtils.toByteArray(entity);
- fos.write(bytes);
- fos.flush();
- fos.close();
- }
- }