2012-11-20 35 views
5

我試圖把文件上傳到服務上使用CORS不同的領域,但他們一直由於產地被拒絕失敗。據我所見,正在使用正確的標題來允許這一點。CORS發佈與預檢要求

的Javascript請求:從預檢OPTIONS請求

var xhr = new XMLHttpRequest(); 
    xhr.open('POST', "https://files.example.com", true);                                
    xhr.setRequestHeader('Content-Type', 'application/json'); 
    xhr.onreadystatechange = function() { 
    if (this.status == 200 && this.readyState == 4) { 
     console.log('response: ' + this.responseText); 
    } 
    }; 

    xhr.send(); 

響應:

Access-Control-Allow-Headers:Origin, Authorization, Content-Type 
Access-Control-Allow-Methods:POST, OPTIONS 
Access-Control-Allow-Origin:* 
Content-Length:0 
Content-Type:application/json 
Date:Mon, 19 Nov 2012 23:30:21 GMT 

標頭POST請求:

Cache-Control:no-cache 
Content-Type:application/json 
Origin:https://www.example.com 
Pragma:no-cache 
Referer:https://www.example.com 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.19 (KHTML, like  Gecko) Chrome/25.0.1325.0 Safari/537.19 

這會導致錯誤:

XMLHttpRequest cannot load https://files.example.com. Origin https://www.example.com is not allowed by Access-Control-Allow-Origin. 
+0

你有沒有解決這個問題我也面臨類似的問題http://stackoverflow.com/questions/15094620/unable-to-make-cors-post-request-in-javascript-to-java-web-servicejersey/15096479 –

+1

此請求是否已獲得認證?如果是這樣,Access-Control-Allow-Origin需要匹配Origin(不能使用通配符)。 – maxbeatty

回答

0

嘗試增加高速緩存控制和附註在預檢允許報頭的列表。完整標題應如下所示:

Access-Control-Allow-Headers: Cache-Control, Pragma, Origin, Authorization, Content-Type 
1

子域不同。就CORS而言,Origin和Access-Control-Allow-Origin中的子域,協議和端口必須相同。

在您的例子,它看起來像的起源是:https://www.example.com 和訪問控制允許來源是:https://files.example.com

+0

但他使用了Access-Control-Allow-Origin:*,它支持每一個來源 – Oooogi

1

不幸的是,發佈到比你的頁面的CORS引起其他的域。這還包括不同的子域,端口和協議(http/https)。

印前檢查完成時,請求是「不簡單的」,意思是,內容類型報頭設置爲「文本/純」以外的內容。你的「application/json」讓瀏覽器害怕進行預檢。

如果這些50-200毫秒對你很重要,那麼你可以重寫你的Web服務理解「簡單」的內容類型。如果沒有,那麼當它被分配任務(http方法)時,你應該讓你的web服務返回HTTP狀態204(沒有內容)。

當與WCF處理:

WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.NoContent; 
0

這是有點晚了,但看着你的信息就說明了起飛前的CORS檢查工作確定,只是實際的(第2)CORS請求,其中響應得到被瀏覽器阻止。

很遺憾,您沒有包括實際(第二)CORS請求的響應,因爲這可能包含了響應拒絕的線索。我懷疑的是,儘管飛行前的響應正確包含了頭:

Access-Control-Allow-Origin:* 

...您的實際(第2)反應可能沒有包含這個頭,在這種情況下,瀏覽器正確地拒絕響應。如果我的假設是真實的,解決方案是將此標題也包含在實際(非飛行前)響應中。