使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

i042416發表於2019-06-22

我們用apache的HttpClient這個庫消費雲端的Restful API時,一般都需要兩次HTTP呼叫,第一次獲得某種token,比如獲取防止跨域請求偽造攻擊Cross-site request forgery - CSRF的token,或者比如微信API的access token,第二次再進行真正的API消費。

通常情況下,第一次請求完畢後,伺服器都會給客戶端返回一些cookie欄位,在第二次請求時,如果使用的是postman測試工具或者apache的HttpClient這個庫,cookie欄位都會自動被附加在第二次請求的HTTP頭部。詳情可以參考我寫的另一篇部落格:OData service parallel performance measurement – how to deal with XSRF token in Java Program and JMeter
https://blogs.sap.com/2017/08/28/odata-service-parallele-performance-measurement-how-to-deal-with-xsrf-token-in-java-program-and-jmeter/

本文就來介紹apache的HttpClient,在傳送第二個Http請求時,是如何自動插入從第一個請求獲得的伺服器頒發的cookie的。

首先進入HttpClient的單步除錯:InternalHttpClient.doExecute方法:

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

第85行的origheaders,即取出程式設計師在程式碼裡指定的http請求頭部欄位,比如basic Authentication,content-type,token等等:

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

這個cookie是什麼時候傳進來的?

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

看來我們必須進入httpcore-4.4.3.jar這個apache HttpClient的實現裡去除錯。

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

經過觀察發現,一旦我執行完204行的conn.sendRequestHeader方法,就能觀察到Cookie被自動設定了,所以奧妙就在第204行裡。

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

自動新增Content-Length頭部欄位:

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

由此可見Content-length是通過方法entity.getContentLength()自動計算出來的,因此我們程式設計師不必在自己的應用程式碼裡重複這個計算動作。

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

自動加入host欄位:

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

自動加入Connection: Keep-Alive

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

UserAgent的自動填充:Apache-HttpClient/4.5.1, 這個也不用程式設計師操心。

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

終於到了我要找的RequestAddCookies這個HTTPRequestInterceptor了。光從這個類的字面意思就能猜到它和HTTP請求的Cookie有關。

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

新建一個Cookie,這個CookieOrigin建構函式裡的hpst,path和secure標誌位都是Chrome開發者工具的Cookie標籤頁裡能看到。

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

從 Cookie Store裡取出前一次請求中由伺服器返回的Cookie:

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的
使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的
使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

這裡把Cookie store裡的cookie加到第二個請求的頭部欄位,謎底就這樣解開了。

使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的

要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":


使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2648443/,如需轉載,請註明出處,否則將追究法律責任。

相關文章