使用apache的HttpClient進行http通訊,隱藏的HTTP請求頭部欄位是如何自動被新增的
我們用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方法:
第85行的origheaders,即取出程式設計師在程式碼裡指定的http請求頭部欄位,比如basic Authentication,content-type,token等等:
這個cookie是什麼時候傳進來的?
看來我們必須進入httpcore-4.4.3.jar這個apache HttpClient的實現裡去除錯。
經過觀察發現,一旦我執行完204行的conn.sendRequestHeader方法,就能觀察到Cookie被自動設定了,所以奧妙就在第204行裡。
自動新增Content-Length頭部欄位:
由此可見Content-length是通過方法entity.getContentLength()自動計算出來的,因此我們程式設計師不必在自己的應用程式碼裡重複這個計算動作。
自動加入host欄位:
自動加入Connection: Keep-Alive
UserAgent的自動填充:Apache-HttpClient/4.5.1, 這個也不用程式設計師操心。
終於到了我要找的RequestAddCookies這個HTTPRequestInterceptor了。光從這個類的字面意思就能猜到它和HTTP請求的Cookie有關。
新建一個Cookie,這個CookieOrigin建構函式裡的hpst,path和secure標誌位都是Chrome開發者工具的Cookie標籤頁裡能看到。
從 Cookie Store裡取出前一次請求中由伺服器返回的Cookie:
這裡把Cookie store裡的cookie加到第二個請求的頭部欄位,謎底就這樣解開了。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2648443/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HTTP請求頭的Content-Type欄位HTTP
- HTTP 請求響應頭部欄位裡 ETAG 的用法舉例HTTP
- HTTP 請求頭部欄位中 connection - keep-alive 的含義HTTPKeep-Alive
- http請求頭個欄位解釋HTTP
- 使用 $fetch 進行 HTTP 請求HTTP
- 網路通訊5:執行HTTP的GET/POST請求HTTP
- SAP ABAP Gateway 系統裡 HTTP 請求響應頭部欄位 DataServiceVersion 的可能取值範圍GatewayHTTP
- MDN新增“HTTP有條件請求”標頭HTTP
- [譯]axios 是如何封裝 HTTP 請求的iOS封裝HTTP
- 如何在HTTP頭中隱藏PHP版本號HTTPPHP
- http請求頭與響應頭的應用HTTP
- Angular 如何通過 HTTP Interceptor 實現 HTTP 請求的超時監控AngularHTTP
- 使用IDEA的 HTTP request發請二進位制資料流訪問請求IdeaHTTP
- HTTP請求頭與響應頭HTTP
- 如何使用axios發出高大上的HTTP請求iOSHTTP
- C++使用libcurl進行http通訊C++HTTP
- HttpClient 進行soap請求HTTPclient
- 使用Python獲取HTTP請求頭資料PythonHTTP
- 在ASP.NET Core中用HttpClient(五)——通過CancellationToken取消HTTP請求ASP.NETHTTPclient
- 使用Socket進行HTTP請求與報文講解HTTP
- 使用 gorilla/mux 進行 HTTP 請求路由和驗證GoUXHTTP路由
- 使用 http-proxy 對網路請求進行代理HTTP
- HTTP的請求過程HTTP
- golang 的 http 請求池GolangHTTP
- iframe隱藏頭部的toolbar
- 理解ASP.NET Core - 傳送Http請求(HttpClient)ASP.NETHTTPclient
- HTTP 頭部欄位 Cache Control max-age = 0 和 no-cache 的區別HTTP
- 【HTTP】HTTP請求體中的四種格式HTTP
- 合併HTTP請求vs並行HTTP請求,到底誰更快?HTTP並行
- 合併HTTP請求 vs 並行HTTP請求,到底誰更快?HTTP並行
- 使用 http-proxy 代理 HTTP 請求時遇到的 the requested url is invalid 錯誤訊息HTTP
- 關於常用的http請求頭以及響應頭詳解HTTP
- 說說 HTTP 常見的請求頭有哪些? 作用?HTTP
- HTTP常用請求頭大揭祕HTTP
- 【python介面自動化】- 使用requests庫傳送http請求PythonHTTP
- SAP Spartacus UI 透過 HTTP Interceptor 給請求新增 Authorization 欄位的原始碼分析UIHTTP原始碼
- logstash 收集 http POST請求中的json日誌時,欄位衝突問題HTTPJSON
- HTTP請求頭和響應頭詳解HTTP