1. 程式人生 > >HttpClient模擬瀏覽器登入後發起請求(攜帶Cookie發請求)以及網頁顯示的事件過程

HttpClient模擬瀏覽器登入後發起請求(攜帶Cookie發請求)以及網頁顯示的事件過程

瀏覽器的工作:

  1請求一個需要登入的頁面或資源
  2伺服器判斷當前的會話是否包含已登入資訊。如果沒有登入重定向到登入頁面
  3手工在登入頁面錄入正確的賬戶資訊並提交
  4伺服器判斷登入資訊是否正確,如果正確則將登入成功資訊儲存到session中
  5登入成功後伺服器端給瀏覽器返回會話的SessionID資訊儲存到客戶端的Cookie中
  6瀏覽器自動跳轉到之前的請求地址並攜帶之前的Cookie(包含登入成功的SessionID)
  7伺服器端判斷session中是否有成功登入資訊,如果有則將請求的資源反饋給瀏覽器

出現再螢幕上的每個網頁所發生的事件:

    1.
直接在瀏覽器上輸入一個URL,也可以單擊頁面上的某個連結來獲取一個網頁,URL包含獲取網際網路上目標檔案所需的一切資訊. 2.自己的瀏覽器向以URL命名的伺服器傳送一個HTTP請求,以獲取某個特定的檔案.如果URL指定的是一個目錄(而不是一個檔案),就是在請求獲取目錄中的預設檔案. 3.伺服器尋找被請求的檔案,併發送一個HTTP的反饋 a>如果找不到頁面,伺服器就會返回錯誤訊息,這些訊息通常是"404 Not Found",當然還有很多其他的錯誤訊息. b>如果找到檔案,伺服器就會取得請求的檔案,並且把它返回給瀏覽器. 4.瀏覽器解析HTML檔案,如果頁面包含圖片,(使用HTML的img元素)或者其他外部的紫原如指令碼,瀏覽器就會與伺服器再次通訊,以獲取標記指定的圖片. 5.
瀏覽器在每個img元素指定位置插入圖片,然後整個網頁就整合好了.

這是最近寫的一個模擬登入微博手機版的小程式

package loginweibo;

import com.sun.xml.internal.bind.v2.runtime.reflect.opt.Const;
import org.apache.http.Consts;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig
; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import sun.rmi.runtime.Log; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * Created by pl on 15-7-19. */ public class weibo { public static void main(String[] args) throws NullPointerException{ //登入頁面的URL String Loginurl ="http://login.weibo.cn/login/"; String firstpage = "http://weibo.cn/?vt=4"; //微博首頁的網址 String loginnum = "18829289882"; String loginpwd = "pl19710504"; CloseableHttpClient httpclient = HttpClients.createDefault(); //建立客戶端的連結 HttpGet httpget = new HttpGet(Loginurl); try{ CloseableHttpResponse response = httpclient.execute(httpget); String responhtml = null; try { responhtml = EntityUtils.toString(response.getEntity()); //System.out.println(responhtml); } catch (IOException e1) { e1.printStackTrace(); } //將vk的值截出來,split將整個的html分為兩個部分,擷取下面的部分 String vk = responhtml.split("<input type=\"hidden\" name=\"vk\" value=\"")[1].split("\" /><input")[0]; System.out.println(vk); String pass = vk.split("_")[0]; String finalpass = "password_"+pass; System.out.println(finalpass); response.close(); List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>(); pairs.add(new BasicNameValuePair("mobile",loginnum)); pairs.add(new BasicNameValuePair(finalpass,"pl19710504")); pairs.add(new BasicNameValuePair("remember","on")); pairs.add(new BasicNameValuePair("vk",vk)); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs, Consts.UTF_8); //返回的實體 HttpPost httppost = new HttpPost(Loginurl); httppost.setEntity(entity); //檢測以下響應狀態是否正確 CloseableHttpResponse response2 = httpclient.execute(httppost); System.out.println(response2.getStatusLine().toString()); httpclient.execute(httppost); //登入操作 System.out.println("success"); HttpGet getinfo= new HttpGet("http://m.weibo.cn/p/100803?vt=4"); CloseableHttpResponse res; res = httpclient.execute(getinfo); System.out.println("進入熱門話題的頁面:"); //輸出該頁面的html檔案 System.out.println(EntityUtils.toString(res.getEntity())); res.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } }