2012-12-21 89 views
20

我想發送一個JSON負載的CORS請求。我控制着服務器和客戶端。如何在跨域(CORS)XMLHttpRequest中發送自定義標題?

我一起在這裏如下: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control

服務器具有必須與每個請求一起發送自定義標題。因此,這個自定義標題使得請求'不簡單',因此請求必須用OPTIONS請求進行預檢。

我可以看到jQuery使OPTIONS請求,但它不會發送自定義標題。

方法我試過:使用beforeSend選項

在這兩種情況下,瀏覽器是不是一起發送自定義頁眉。

我使用的是FF 17.0.1,jquery 1.8.3。

+0

在試圖設置標題的位置顯示您的代碼。 – Barmar

+0

'headers:{Header-name:value}'選項不起作用? – Barmar

+0

引起問題的標題名稱是什麼?我同意Barmar,顯示你所有的JS代碼和請求/響應可以幫助調試。 – monsur

回答

30

你的問題不在於jquery,它在how CORS works。您的beforeSend回調可能按預期工作......但瀏覽器不會在預檢請求中發送自定義標頭,無論如何。這是設計的;預檢請求的目的是確定useragent(瀏覽器)允許發送超出CORS規範中定義的「簡單」內容的信息。因此,作爲預檢請求的一部分,useragent發送任何非簡單數據(例如您的自定義標題)是自我毀滅的。

要指示useragent將您的自定義標題包含在實際的CORS請求中,請在預檢響應中包含Access-Control-Allow-Headers header。值得注意的是,如果您不太關心useragent傳輸的標頭,我相信您只需回顯Access-Control-Request-Headers請求標頭字段的值作爲您在響應中發送的Access-Control-Allow-Headers的值即可。

您可能還需要包含一些在syntax section of the spec中定義的其他Access-Control-Allow-*標頭。

CORS - How do 'preflight' an httprequest?

見也見Mozilla's CORS preflight example,這表明在行動這些頭。

+1

謝謝。在預檢響應發生後我有事情可做,這只是OPTIONS調用問題。看起來我必須使用基於服務器的解決方法。 – mooreds

+0

@mooreds - 您可以提供預檢請求中發送/接收標題的快照嗎?您的服務器拒絕OPTIONS請求的問題是因爲它沒有自定義標頭嗎? '猜猜我不明白爲什麼你需要服務器解決方法,如果事情在預檢反應後工作的話。 – broofa

+0

是的,OPTIONS請求被拒絕,因爲它沒有自定義頭。在chrome上,剩下的數據仍然被髮送(可能是因爲我在本地主機上開發,不確定),但是對於Firefox,一旦OPTIONS請求失敗,其餘請求將失敗。 – mooreds

相關問題