2011-06-11 73 views
15

我想創建一個使用nodejs的EventSource服務器,這將服務器請求跨域。我發送Access-Control-Allow-Origin標題,但瀏覽器(不包括Chrome或Opera)不讓我連接。有我送回的標題:跨域事件源

this._response.writeHead(200, { 
    'Content-Type': 'text/event-stream', 
    'Cache-Control': 'no-cache', 
    'Connection': 'keep-alive', 
    'Access-Control-Allow-Origin': '*', 
    'Access-Control-Allow-Credentials': 'true' 
}); 

我該如何以正確的方式做到這一點?

問候

+0

Opera不支持[CORS](http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing)。 – yojimbo87 2011-06-11 15:40:19

+1

也許,但Chrome不支持CORS,而且我仍然會得到安全性異常(SECURITY_ERR:DOM Exception 18)。我相信一定有黑客,像XHR的Acces-Control-Allow-Origin,但我無法找到它。 – 2011-06-11 21:04:36

+1

雖然http://www.w3.org/TR/cors/有一個部分顯示了它如何與SSE一起使用,但似乎瀏覽器暫時忽略了它,目前還不支持CORS + SSE。 – Evgeny 2011-06-13 01:09:04

回答

3

CORS允許憑據不能使用,讓出身設置爲*。 考慮在您的回覆中寫入收到的Origin-header

2

嘗試使用以下代替代碼的代碼塊。瀏覽器將調用一次OPTIONS,然後請求將按照預期進行。

你不會需要if聲明,如果你已經打破了請求方法 - 但我想給你,以防萬一你收留了它像的Hello World例子做了全面的塊。

if (req.method === "OPTIONS") { 
    console.log('!OPTIONS'); 
    var headers = {}; 
    // IE8 does not allow domains to be specified, just the * 
    // headers["Access-Control-Allow-Origin"] = req.headers.origin; 
    headers["Access-Control-Allow-Origin"] = "*"; 
    headers["Access-Control-Allow-Methods"] = "POST, GET, PUT, DELETE, OPTIONS"; 
    headers["Access-Control-Allow-Credentials"] = false; 
    headers["Access-Control-Max-Age"] = '86400'; // 24 hours 
    headers["Access-Control-Allow-Headers"] = "X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept"; 
    res.writeHead(200, headers); 
    res.end(); 
} 
1

如果您使用跨域資源,則獲得Security Exception (SECURITY_ERR: DOM Exception 18)。這可能是由於:

  1. 嘗試通過file://訪問本地資源,從另一臺服務器不允許CORS或
  2. 也許你或
  3. (本地文件不通過節點服務器提供),試圖訪問資源正在從本地文件而不是從節點服務器提供的URL測試頁面。