2012-12-27 65 views
6

我試圖將瀏覽器與提供服務器發送事件(SSE)的服務器連接。該服務器具有與原始域不同的域。例如,如果您撥打http://d1.example.com/page此頁面將嘗試連接到http://d2.example.com/subscribe上的SSE頻道。嘗試這樣做,會提示以下錯誤:SSE未捕獲錯誤:SECURITY_ERR:DOM異常18與提供服務器發送事件(SSE)的服務器

Uncaught Error: SECURITY_ERR: DOM Exception 18

就行了:

var source = new EventSource("http://d2.example.com/subscribe")

我該如何解決呢?

更新(即我已經嘗試瞭解決方案):

1 CORS

我加入Access-Control-Allow-Origin:*到我的web服務d2.example.com的頭部試圖CORS。它沒有解決EventSource的問題,即使來自d1.example.com的呼叫現在工作正常!我認爲SSE適用於正常的HTTP請求,那麼爲什麼它不適用於Chrome?

2-重定向

我使用的httpd服務器,所以我創建在通過上證所要求d2.example.comd1.example.com虛擬主機重定向規則。它與Firefox完美配合。另一方面,Chrome沒有提示任何錯誤,也沒有連接到SSE服務器。它看起來像是傾銷了整個EventSource命令。它看起來像這樣的解決方案行不通,所以讓我們繼續前進......

3-反向代理

連接上d1.example.com/subscribe兩種瀏覽器,其本質上是通過反向代理連接到d2.example.com。但是,即使瀏覽器關閉,也不會捕獲on_close事件。這是有道理的,因爲D2服務器現在正在與代理服務器建立通道。我如何將on_close事件從代理服務器轉發到d2?

有什麼不同的方法可以使這項工作?

+0

@Jack這是不一樣的問題。這個問題不需要文件。一個文件是很容易的,你可以做一個重定向規則作爲最壞的情況下或反向代理。上證所不會用這些解決方案。 – wael34218

回答

4

可能性很高這是一個跨源資源共享問題,您必須在相關域上啓用該功能。

http://enable-cors.org/

正如MDN說:

Note: Although it's not yet part of the standard, EventSource supports CORS in Firefox 11 and later. This is expected to become standard soon.

+0

它不起作用。 'Access-Control-Allow-Origin:d2.example.com'現在顯示在響應標題中。然而'EventSource(「http://d2.example.com/subscribe」)仍然會產生相同的錯誤。我正在使用Chrome – wael34218

+0

它正在使用Firefox,但不使用Chrome – wael34218

+4

1)CORS + EventSource現在是標準版本的一部分; 2)CORS + EventSource支持FF 11+,Opera 12+,並將在Chrome 25中支持; 3)你可以使用帶有CORS支持的polyfill來支持EventSource – 4esn0k

相關問題