HttpClient模擬瀏覽器登入後發起請求(攜帶Cookie發請求)以及網頁顯示的事件過程
阿新 • • 發佈:2019-01-07
瀏覽器的工作:
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();
}
}
}
}