摘要:通常情況下,第一次請(qǐng)求完畢后,服務(wù)器都會(huì)給客戶端返回一些字段,在第二次請(qǐng)求時(shí),如果使用的是測(cè)試工具或者的這個(gè)庫(kù),字段都會(huì)自動(dòng)被附加在第二次請(qǐng)求的頭部。從里取出前一次請(qǐng)求中由服務(wù)器返回的這里把里的加到第二個(gè)請(qǐng)求的頭部字段,謎底就這樣解開了。
我們用apache的HttpClient這個(gè)庫(kù)消費(fèi)云端的Restful API時(shí),一般都需要兩次HTTP調(diào)用,第一次獲得某種token,比如獲取防止跨域請(qǐng)求偽造攻擊Cross-site request forgery - CSRF的token,或者比如微信API的access token,第二次再進(jìn)行真正的API消費(fèi)。
通常情況下,第一次請(qǐng)求完畢后,服務(wù)器都會(huì)給客戶端返回一些cookie字段,在第二次請(qǐng)求時(shí),如果使用的是postman測(cè)試工具或者apache的HttpClient這個(gè)庫(kù),cookie字段都會(huì)自動(dòng)被附加在第二次請(qǐng)求的HTTP頭部。詳情可以參考我寫的另一篇博客:OData service parallel performance measurement – how to deal with XSRF token in Java Program and JMeter
https://blogs.sap.com/2017/08...
本文就來(lái)介紹apache的HttpClient,在發(fā)送第二個(gè)Http請(qǐng)求時(shí),是如何自動(dòng)插入從第一個(gè)請(qǐng)求獲得的服務(wù)器頒發(fā)的cookie的。
首先進(jìn)入HttpClient的單步調(diào)試:InternalHttpClient.doExecute方法:
第85行的origheaders,即取出程序員在代碼里指定的http請(qǐng)求頭部字段,比如basic Authentication,content-type,token等等:
這個(gè)cookie是什么時(shí)候傳進(jìn)來(lái)的?
看來(lái)我們必須進(jìn)入httpcore-4.4.3.jar這個(gè)apache HttpClient的實(shí)現(xiàn)里去調(diào)試。
經(jīng)過(guò)觀察發(fā)現(xiàn),一旦我執(zhí)行完204行的conn.sendRequestHeader方法,就能觀察到Cookie被自動(dòng)設(shè)置了,所以?shī)W妙就在第204行里。
自動(dòng)添加Content-Length頭部字段:
由此可見(jiàn)Content-length是通過(guò)方法entity.getContentLength()自動(dòng)計(jì)算出來(lái)的,因此我們程序員不必在自己的應(yīng)用代碼里重復(fù)這個(gè)計(jì)算動(dòng)作。
自動(dòng)加入host字段:
自動(dòng)加入Connection: Keep-Alive
UserAgent的自動(dòng)填充:Apache-HttpClient/4.5.1, 這個(gè)也不用程序員操心。
終于到了我要找的RequestAddCookies這個(gè)HTTPRequestInterceptor了。光從這個(gè)類的字面意思就能猜到它和HTTP請(qǐng)求的Cookie有關(guān)。
新建一個(gè)Cookie,這個(gè)CookieOrigin構(gòu)造函數(shù)里的hpst,path和secure標(biāo)志位都是Chrome開發(fā)者工具的Cookie標(biāo)簽頁(yè)里能看到。
從 Cookie Store里取出前一次請(qǐng)求中由服務(wù)器返回的Cookie:
這里把Cookie store里的cookie加到第二個(gè)請(qǐng)求的頭部字段,謎底就這樣解開了。
要獲取更多Jerry的原創(chuàng)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙":
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/36027.html
摘要:通常情況下,第一次請(qǐng)求完畢后,服務(wù)器都會(huì)給客戶端返回一些字段,在第二次請(qǐng)求時(shí),如果使用的是測(cè)試工具或者的這個(gè)庫(kù),字段都會(huì)自動(dòng)被附加在第二次請(qǐng)求的頭部。從里取出前一次請(qǐng)求中由服務(wù)器返回的這里把里的加到第二個(gè)請(qǐng)求的頭部字段,謎底就這樣解開了。 我們用apache的HttpClient這個(gè)庫(kù)消費(fèi)云端的Restful API時(shí),一般都需要兩次HTTP調(diào)用,第一次獲得某種token,比如獲取防止...
摘要:所以跨域請(qǐng)求分兩種簡(jiǎn)單請(qǐng)求和預(yù)檢請(qǐng)求。但對(duì)于第二個(gè)錯(cuò)誤,好像沒(méi)法向第一種那樣,將預(yù)檢請(qǐng)求轉(zhuǎn)變?yōu)楹?jiǎn)單請(qǐng)求,所以,只有尋找方法怎么在后端實(shí)現(xiàn)相應(yīng)的預(yù)檢請(qǐng)求,來(lái)返回一個(gè)狀態(tài)碼,告訴瀏覽器此次跨域請(qǐng)求可以繼續(xù)。 引子 自從從JAVA偽全棧轉(zhuǎn)前端以來(lái),學(xué)習(xí)的路上就充滿了荊棘(奇葩問(wèn)題),而涉及前后端分離這個(gè)問(wèn)題,對(duì)cors的應(yīng)用不斷增多,暴露出的問(wèn)題也接踵而至。這兩天動(dòng)手實(shí)踐基于Token的WE...
摘要:所以跨域請(qǐng)求分兩種簡(jiǎn)單請(qǐng)求和預(yù)檢請(qǐng)求。但對(duì)于第二個(gè)錯(cuò)誤,好像沒(méi)法向第一種那樣,將預(yù)檢請(qǐng)求轉(zhuǎn)變?yōu)楹?jiǎn)單請(qǐng)求,所以,只有尋找方法怎么在后端實(shí)現(xiàn)相應(yīng)的預(yù)檢請(qǐng)求,來(lái)返回一個(gè)狀態(tài)碼,告訴瀏覽器此次跨域請(qǐng)求可以繼續(xù)。 引子 自從從JAVA偽全棧轉(zhuǎn)前端以來(lái),學(xué)習(xí)的路上就充滿了荊棘(奇葩問(wèn)題),而涉及前后端分離這個(gè)問(wèn)題,對(duì)cors的應(yīng)用不斷增多,暴露出的問(wèn)題也接踵而至。這兩天動(dòng)手實(shí)踐基于Token的WE...
閱讀 1670·2021-11-12 10:35
閱讀 1615·2021-08-03 14:02
閱讀 2687·2019-08-30 15:55
閱讀 2028·2019-08-30 15:54
閱讀 761·2019-08-30 14:01
閱讀 2429·2019-08-29 17:07
閱讀 2252·2019-08-26 18:37
閱讀 3032·2019-08-26 16:51