基於SAML2.0的SAP雲產品Identity Authentication過程介紹

咱們用apache的HttpClient這個庫消費雲端的Restful API時,通常都須要兩次HTTP調用,第一次得到某種token,好比獲取防止跨域請求僞造攻擊Cross-site request forgery - CSRF的token,或者好比微信API的access token,第二次再進行真正的API消費。java

一般狀況下,第一次請求完畢後,服務器都會給客戶端返回一些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的。apache

首先進入HttpClient的單步調試:InternalHttpClient.doExecute方法:跨域

第85行的origheaders,即取出程序員在代碼裏指定的http請求頭部字段,好比basic Authentication,content-type,token等等:服務器

這個cookie是何時傳進來的?微信

看來咱們必須進入httpcore-4.4.3.jar這個apache HttpClient的實現裏去調試。cookie

通過觀察發現,一旦我執行完204行的conn.sendRequestHeader方法,就能觀察到Cookie被自動設置了,因此奧妙就在第204行裏。函數

自動添加Content-Length頭部字段:工具

因而可知Content-length是經過方法entity.getContentLength()自動計算出來的,所以咱們程序員沒必要在本身的應用代碼裏重複這個計算動做。post

自動加入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的原創文章,請關注公衆號"汪子熙": image

相關文章
相關標籤/搜索