2011-12-31 53 views
77

我想做一個跨域HTTP請求到WCF服務(我自己)。我已經閱讀了幾種處理跨域腳本限制的技術。因爲我的服務必須兼容GET和POST請求,所以我無法實現一些動態腳本標記,其src是GET請求的URL。由於我可以自由地在服務器上進行更改,因此我開始嘗試實施一種解決方法,其中包括配置服務器響應,以包含「Access-Control-Allow-Origin」標頭和「預檢」請求以及OPTIONS請求。我從這篇文章中得到了這個想法:Getting CORS workingCORS - 如何預檢一個httprequest?

在服務器端,我的web方法正在向HTTP響應添加'Access-Control-Allow-Origin:*'。我可以看到,現在的回覆確實包含了這個頭文件。我的問題是:如何「預檢」請求(選項)?我使用jQuery.getJSON使GET請求,但瀏覽器取消請求與臭名昭著馬上:

產地http://localhost沒有被允許訪問控制允許來源

是誰熟悉這種CORS技術?客戶需要做哪些修改來預檢我的請求?

謝謝!

回答

124

在預檢要求,你應該看到以下兩個頭:訪問控制請求,方法和訪問控制請求報頭。這些請求標頭要求服務器提供實際請求的權限。您的印前檢查響應需要確認這些標頭才能使實際請求生效。

例如,假設瀏覽器發出與下列頭的請求:

Origin: http://yourdomain.com 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: X-Custom-Header 

您的服務器,然後應與下列頭回應:

Access-Control-Allow-Origin: http://yourdomain.com 
Access-Control-Allow-Methods: GET, POST 
Access-Control-Allow-Headers: X-Custom-Header 

要特別注意的訪問控制-Allow-Headers響應頭。這個頭部的值應該與Access-Control-Request-Headers請求頭部中的頭部相同,並且不能是'*'。

一旦您發送了該響應的預檢要求,瀏覽器將會使實際的請求。您可以瞭解更多關於CORS這裏:http://www.html5rocks.com/en/tutorials/cors/

+0

您能否將多個域添加到Access-Control-Allow-Origin? – botbot 2012-12-17 04:59:09

+0

@botbot你現在可能已經做到了這一點,但如果其他人想知道可以做'訪問控制 - 允許 - 原產地:*' – 2013-11-22 15:05:49

+2

我可能錯過了一些東西。那麼我應該發送兩個XMLHttp請求嗎?一個用於預檢;檢查成功的響應,然後發送實際查詢? – Kangkan 2014-01-30 09:08:05

0

雖然這個線程的歷史可以追溯到2014年,這個問題仍然可以當前我們很多。下面是我在jQuery 1.12/PHP 5.6上下文中處理它的方式:

  • jQuery僅使用有限的標頭髮送其XHR請求;只發送'Origin'。
  • 不需要預檢請求。
  • 服務器只需檢測到這樣的請求,並添加「Access-Control-Allow-Origin:」。 $ _SERVER ['HTTP_ORIGIN']頭,在檢測到這是一個跨源XHR。

PHP代碼示例:

if (!empty($_SERVER['HTTP_ORIGIN'])) { 
    // Uh oh, this XHR comes from outer space... 
    // Use this opportunity to filter out referers that shouldn't be allowed to see this request 
    if (!preg_match('@\.partner\.domain\[email protected]')) 
     die("End of the road if you're not my business partner."); 

    // otherwise oblige 
    header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']); 
} 
else { 
    // local request, no need to send a specific header for CORS 
} 

尤其不要因爲不需要預檢添加exit;

相關問題