HttpClient學習筆記 --傳送Cookie
阿新 • • 發佈:2019-01-31
簡介
現在有這樣一個場景:比如我們在天貓購物時,想瀏覽購物車中的商品,做這步操作的前提是我們的app必須是已登入狀態,也就是說某些資源或業務只有登入後才可以操作和檢視。
上面的這個場景,app端和服務端其實是做了如下的操作:
- app端向服務端傳送一個請求,也就是訪問瀏覽購物車的介面;
- 服務端接受請求後,判斷app傳送的請求中是否包含有已登入的資訊,比如Cookie值(包含登入成功的SessionID)是否和服務端的SessionID一致,如果不一致或者沒有該欄位,則需重定向到登入介面;
- 手工在登入頁面錄入正確的賬戶資訊並提交
- 伺服器判斷登入資訊是否正確,如果正確則將登入成功資訊儲存到session中,並且把SessionID資訊儲存到客戶端的Cookie中
- 下次客戶端再次傳送請求時連同,服務端校驗SessionID後,將資源返回給客戶端。
總結一下:傳送Cookie就必須先得到Cookie,所以至少傳送兩次請求,第一次用於得到Cookie,第二次在傳送請求前加上Cookie
例項
下面使用HttpClient模擬上述過程,
首先呼叫登入介面發起登入,登入成功後,服務端會將登入資訊儲存到session中,並且把SessionID(Set-Cookie 它包含在響應頭中)傳送給客戶端,儲存在cookie中的JSESSIONID中。
Cookie頭由客戶端傳送,包含在HTTP請求的頭部中。注意,只有cookie的domain和path與請求的URL匹配才會傳送這個cookie。
public static CookieStore setCookieStore(HttpResponse httpResponse){
CookieStore cookieStore = new BasicCookieStore();
//Set-Cookie由伺服器傳送,它包含在響應請求的頭部中。它用於在客戶端建立一個Cookie
// JSESSIONID
String setCookie = httpResponse.getFirstHeader("Set-Cookie").getValue();
String JSESSIONID = setCookie.substring ("JSESSIONID=".length(), setCookie.indexOf(";"));
System.out.println("JSESSIONID:" + JSESSIONID);
// 新建一個Cookie
BasicClientCookie cookie = new BasicClientCookie("JSESSIONID", JSESSIONID);
cookie.setVersion(0);
cookie.setDomain("127.0.0.1");
cookie.setPath("/LoginClient");
cookieStore.addCookie(cookie);
return cookieStore;
}
下次傳送請求時,重新例項化HttpClient時,只需帶上cookie即可:
HttpClient httpclient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();