1. 程式人生 > >HttpClient學習筆記 --傳送Cookie

HttpClient學習筆記 --傳送Cookie

簡介

現在有這樣一個場景:比如我們在天貓購物時,想瀏覽購物車中的商品,做這步操作的前提是我們的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();