2017-08-08 22 views
1

我試圖在我的應用程序中刪除不必要的飛行前請求。爲此,我簡化了請求的某些部分,刪除了自定義標題等。但是遇到了一個問題 - GET請求現在可以正常工作,不需要預先飛行,但POST請求仍然有它們。CORS:在GET上沒有預先飛行,但在POST上進行了預先飛行

我已經按照要求:

  1. 請求不設置自定義HTTP標頭。
  2. 內容類型爲「text/plain; charset = utf-8」。
  3. 請求方法必須是GET,HEAD或POST之一。如果POST,內容類型應該是application/x-www-form-urlencoded,multipart/form-data或text/plain之一。

GET和POST請求均經過單個httpinvoke調用。

爲例 - GET請求不被飛行前的開頭:

網址:http://mydomain/APIEndpoint/GETRequest?Id=346089&Token=f5h345

請求方法:GET

請求頭

接受:*/*

接受編碼:gzip,放氣

接受語言:UK-UA,UK; Q = 0.8,如; Q = 0.6,的en-US; Q = 0.4,連接; Q = 0.2

緩存 - 控制:無緩存

連接:保持活躍

的Content-Type:text/plain的;字符集= UTF-8

主持人:正確的主機

來源:http://localhost

雜注:無緩存

的Referer:正確引用者

的User-Agent:Mozilla的/ 5.0(視窗NT 10.0; Win64; x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/60.0.3112.90 Safari/537。36

查詢字符串參數

編號= 346089

令牌= f5h345

而且看起來非常相似,但仍與飛行前開頭的POST請求:

URL:http://mydomain/APIEndpoint/GETRequest?param=TEST

請求方法:POST

請求報頭:

接受:*/*

接受編碼:gzip,放氣

接受語言:UK-UA,UK; Q = 0.8,ru; q = 0.6,en-US; q = 0.4,en; q = 0.2

Cache-Control:no-cache

連接:保持活躍

的Content-Length:11

的Content-Type:text/plain的;字符集= UTF-8

主機:

產地:http://localhost

附註:無緩存

的Referer: 的User-Agent:Mozilla的/ 5.0(Windows NT的10.0; Win64上; x64)的爲AppleWebKit/537.36(KHTML,例如Gecko)鉻/ 60.0.3112.90 Safari瀏覽器/ 537.36

查詢字符串參數:

PARAM:TEST

請求負載

{邁德特:{}}

任何意見,將不勝感激!謝謝!

====更新===

按照要求,對於張貼POST請求飛行前的要求:

網址:http://mydomain/APIEndpoint/GETRequest?param=TEST

請求方法:OPTIONS

狀態代碼:200確定

響應標頭

訪問控制允許來源:*

緩存控制:無緩存

的Content-Length:0

日期:星期三,2017年8月9日8時02分16秒GMT

截止日期:-1

雜注:無緩存

服務器:Microsoft-IIS/8.5

X-ASPNET-版本:4.0.30319

X供電,通過:ASP.NET

請求頭

接受:*/*

Accept-Encoding:gzip,deflate

Accept-Langu年齡:UK-UA,英國; Q = 0.8,如; Q = 0.6,EN-US; Q = 0.4,連接; Q = 0.2

訪問控制請求-方法:POST

的cache控制:無緩存

連接:保持活躍

主持人:正確的主機

來源:http://localhost

雜注:無緩存

Referer:correct referer

User-Agent:Mozilla/5.0(Windows NT 10.0; Win64平臺; 64)爲AppleWebKit/537.36(KHTML,例如Gecko)Chrome瀏覽器/ Safari瀏覽器60.0.3112.90/537.36

查詢字符串參數

PARAM:TEST

這是它使用httpinvoke庫中的遺留代碼。代碼片斷實際執行的呼叫:

_converters: { 
    'text json': function (input, reviver) {}, 
    'json text': JSON.stringify 
}; 

headers = { 
    'Content-Type': 'text/plain; charset=utf-8' 
}; 

data = {params: "test"}; 

httpinvoke(url, method.toUpperCase(), { 
    corsExposedHeaders: ['Content-Type'], 
    headers: headers, 
    input: data, 
    converters: _converters,     
    inputType: 'json', 
    outputType: 'json', 
    timeout: self._getMessageTimeout() 
}).then(function (res) {}, function (error) {}); 
+0

需要說明的是,您能否準確解釋如何知道瀏覽器在GET請求的情況下未進行預檢?例如,我猜你可能已經瀏覽了瀏覽器devtools中的網絡窗格,並且您看到瀏覽器正在顯示POST的預檢而不是GET?並且POST請求的情況是預檢成功還是您的瀏覽器devtools控制檯顯示有關預檢的任何類型的錯誤消息? – sideshowbarker

+0

是的,我使用DEV工具來檢查結果。是的,如果POST預先飛行確實成功。可以肯定的是,請求網址是正確的,因爲它們可以很好地處理舊版本的請求。舊版本在GET和POST版本的頭文件中都有自定義字段,都生成了預檢請求。 – North

+0

非常感謝,在OPTIONS請求的響應中,沒有Access-Control-Allow-Headers響應頭?並且沒有Access-Control-Allow-Methods響應頭,儘管請求有一個Access-Control-Request-Method:POST請求頭? – sideshowbarker

回答

2

如果在XMLHttpRequestUpload對象上註冊事件偵聽器可能發生這種情況(即強制預檢;看到https://xhr.spec.whatwg.org/the note on the use-CORS-preflight flag,並且a related notehttps://fetch.spec.whatwg.org/the updated documentation on CORS preflight requestsMDN CORS article)。

httpinvoke做到了嗎?

+0

在httpinvoke代碼中,我看到以下內容: 'xhr.upload.onerror = function(){}; xhr.upload.onprogress = onuploadprogress;' 它確實添加了一個事件處理程序。 如何格式化評論中的代碼? – North

+0

所以你是說如果設置了任何xhr.upload事件監聽器 - 預發送請求會自動發送?對, – North

+0

是的,就是這樣。 – Anne

1

作爲@Anne提到了POST發送飛行前請求的原因,儘管請求本身符合XMLHttpRequestUpload事件偵聽器中的「簡單請求」規則(因此不需要預先飛行)。

XMLHttpRequestUpload本身可能沒有在代碼中提及,但您可以隨時在xhr.upload變量中找到它。 http-invoke庫就是這種情況。

所以完全無辜的看着這樣的代碼:

xhr.upload.onprogress = onuploadprogress;

實際上導致強制性飛行前的請求。

感謝所有幫助解決此問題的人。