2012-12-27 12 views
6

Próbuję połączyć przeglądarki z serwerem, który udostępnia zdarzenia wysłane przez serwer (SSE). Ten serwer ma inną domenę niż pierwotna. Na przykład, jeśli zadzwonisz pod numer http://d1.example.com/page, ta strona spróbuje połączyć się z kanałem SSE pod numerem http://d2.example.com/subscribe. Próbując zrobić poprosi następujący błąd:Błąd SSE Uncaught: SECURITY_ERR: DOM Exception 18 z serwerem udostępniającym zdarzenia wysłane przez serwer (SSE)

Uncaught Error: SECURITY_ERR: DOM Exception 18

na linii:

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

Jak mogę to naprawić?

Update (Rozwiązania, które próbowałem out):

1- CORS

Próbowałem CORS dodając Access-Control-Allow-Origin:* do nagłówków mojego serwisu WWW d2.example.com. To nie rozwiązało problemu z EventSource, mimo że połączenia $.get("http://d2.example.com") od d1.example.com działają teraz dobrze! Myślałem, że SSE działa na zwykłych żądaniach HTTP, więc dlaczego nie działa w Chrome?

2- Przekierowanie

Używam serwera httpd, więc stworzyłem regułę przekierowania w d1.example.com wirtualnego hosta, który przekazuje żądania SSE do d2.example.com. Doskonale działało z Firefoksem. Z drugiej strony Chrome nie monitował o żaden błąd i nie łączył się z serwerem SSE. Wygląda na to, że porzuciło całą komendę EventSource. Wygląda na to, to rozwiązanie nie będzie działać, więc przejdźmy dalej ...

3- reverse proxy

obu przeglądarkach podłączone d1.example.com/subscribe który jest w zasadzie z połączeniem d2.example.com przez reverse proxy. Ale zdarzenie on_close nigdy nie zostanie przechwycone, nawet jeśli przeglądarka jest zamknięta. Ma to sens, ponieważ serwer d2 tworzy teraz kanał z serwerem proxy. Jak mogę przekazać zdarzenie z serwera proxy do d2?

Czy istnieją różne sposoby, aby to zadziałało?

+0

@Jack To nie to samo pytanie. To pytanie nie wymaga pliku. Plik jest dość łatwy, możesz ustawić regułę przekierowania jako najgorszy scenariusz lub odwrotny serwer proxy. SSE nie będzie działać według tych rozwiązań. – wael34218

Odpowiedz

4

Szanse są wysokie, jest to kwestia dzielenia zasobów pochodzących z różnych źródeł, którą należy włączyć w odpowiednich domenach.

http://enable-cors.org/

Jako MDN mówi:

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

To nie działa. 'Access-Control-Allow-Origin: d2.example.com' jest teraz wyświetlane w nagłówku odpowiedzi. Jednak 'EventSource (" http://d2.example.com/subscribe ")' nadal powoduje ten sam błąd. Używam Chrome – wael34218

+0

Działa na Firefoxie, ale nie na Chrome – wael34218

+4

1) CORS + EventSource jest teraz częścią standardowej wersji; 2) CORS + EventSource jest obsługiwany w FF 11+, Opera 12+ i będzie w Chrome 25; 3) ty używasz polyfill z obsługą CORS dla EventSource – 4esn0k

Powiązane problemy