掃二維碼與項目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
某站點(diǎn)反饋極少數情況下某正常接口返回的結果為空,而正常情況下這個(gè)接口返回的結果不可能為空。
x1 問(wèn)題分析
通過(guò)打開(kāi)日志記錄分析日志,發(fā)現服務(wù)端請求日志中出現了異常的OPTIONS請求,而正常情況下應該是post請求。如下圖所示:
從上述日志記錄可知,在請求的header中還包含了origin字段,正常非跨域的請求是不會(huì )出現這個(gè)字段的。但是這個(gè)網(wǎng)站并沒(méi)有做前后端分離,理論上在站內訪(fǎng)問(wèn)不會(huì )存在跨域請求。再次根據上述日志細看,發(fā)現referer等信息都是http請求的頁(yè)面,也就是這個(gè)請求是在http頁(yè)面發(fā)起了。
然而這個(gè)網(wǎng)站默認訪(fǎng)問(wèn)方式是https,只是沒(méi)做強制必須用https訪(fǎng)問(wèn),也就是http也可以訪(fǎng)問(wèn)。估計是極個(gè)別網(wǎng)站手動(dòng)輸入頁(yè)面地址使用的是http路徑訪(fǎng)問(wèn)。請求例子如下:
ajax('post','http://test.csweigou.com/api/test/index',{data},0,function (d) { console.log(d); });
在http頁(yè)面發(fā)送上述請求后,發(fā)現控制臺網(wǎng)絡(luò )監聽(tīng)界面出現了3次記錄,如圖所示:
上述三個(gè)記錄分別是:①、307重定向;②、跨站請求被禁止;③、觸發(fā)預檢。而在后臺服務(wù)端日志中看到的OPTIONS請求其實(shí)就是第三條記錄產(chǎn)生的。如圖所示:
x2 問(wèn)題解決
在后臺服務(wù)端獲取前臺發(fā)送的請求數據的時(shí)候,我們一般是不會(huì )使用OPTIONS來(lái)接受數據,于是就導致了最開(kāi)始提到的接口數據為空的異常結果。要避免解決這樣的問(wèn)題可以強制使用https,全站強制啟用https訪(fǎng)問(wèn),即便用戶(hù)手工輸入http鏈接也會(huì )重定向到https,這樣就不會(huì )產(chǎn)生跨站請求。
x3 相關(guān)知識鏈接
關(guān)于出現OPTIONS請求,這種請求方式并不是我們預期常見(jiàn)的訪(fǎng)問(wèn)請求,根據查閱相關(guān)資料可知有如下幾個(gè)跟OPTIONS有關(guān)系的要點(diǎn)(下面3個(gè)要點(diǎn)是網(wǎng)絡(luò )上其他網(wǎng)友總結的,僅供參考):
1、Http Options Method:OPTIONS請求方法的主要用途有兩個(gè):①、獲取服務(wù)器支持的HTTP請求方法;②、用來(lái)檢查服務(wù)器的性能。
2、CORS:即跨域資源共享,是一種網(wǎng)絡(luò )瀏覽器的技術(shù)規范,它為Web服務(wù)器定義了一種方式,允許網(wǎng)頁(yè)從不同的域訪(fǎng)問(wèn)其資源。而這種訪(fǎng)問(wèn)是被同源策略所禁止的。CORS系統定義了一種瀏覽器和服務(wù)器交互的方式來(lái)確定是否允許跨域請求。
3、Preflighted Requests:即預檢請求,是CORS中一種透明服務(wù)器驗證機制。預檢請求首先需要向另外一個(gè)域名的資源發(fā)送一個(gè) HTTP OPTIONS 請求頭,其目的就是為了判斷實(shí)際發(fā)送的請求是否是安全的。下面的2種情況需要進(jìn)行預檢: ①、簡(jiǎn)單請求,比如使用Content-Type 為 application/xml 或 text/xml 的 POST 請求; ②、置自定義頭,比如 XJSON等。
我們在微信上24小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流