Неперехваченная ошибка SSE: SECURITY_ERR: исключение DOM 18 с сервером, который предоставляет события, отправленные сервером (SSE)

Я пытаюсь подключить браузеры к серверу, который предоставляет события, отправленные сервером (SSE). Этот сервер имеет домен, отличный от исходного. Например, если вы позвоните http://d1.example.com/page, эта страница попытается подключиться к каналу SSE на http://d2.example.com/subscribe. Попытка сделать это вызовет следующую ошибку:

Uncaught Error: SECURITY_ERR: DOM Exception 18

на линии:

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

Как я могу это исправить?

Обновление (решения, которые я опробовал):

1- КОРС

Я попробовал CORS, добавив Access-Control-Allow-Origin:* в заголовки моего веб-сервиса d2.example.com. Это не решило EventSource проблему, хотя $.get("http://d2.example.com") вызовы с d1.example.com страниц теперь работают нормально! Я думал, что SSE работает с обычными HTTP-запросами, так почему же он не работает в Chrome?

2- Перенаправить

Я использую сервер httpd, поэтому я создал правило перенаправления на виртуальном хосте d1.example.com, которое передает запросы SSE на d2.example.com. Он отлично работал с Firefox. С другой стороны, Chrome не выдавал никаких ошибок и не подключался к серверу SSE. Похоже, он сбросил всю команду EventSource. Похоже, это решение никогда не сработает, так что давайте двигаться дальше...

3- Обратный прокси

Оба браузера подключены к d1.example.com/subscribe, который в основном подключается к d2.example.com через обратный прокси. Но событие on_close никогда не перехватывается, даже если браузер закрыт. Это имеет смысл, так как сервер d2 теперь создает канал с прокси-сервером. Как я могу перенаправить событие on_close с прокси-сервера на d2?

Есть ли другие способы, которые могли бы заставить это работать?


person wael34218    schedule 27.12.2012    source источник
comment
@ Джек Это не тот же вопрос. Этот вопрос не требует файла. Файл довольно прост, вы можете сделать правило перенаправления в качестве наихудшего сценария или обратного прокси. SSE не будет работать с этими решениями.   -  person wael34218    schedule 27.12.2012


Ответы (1)


Скорее всего, это проблема совместного использования ресурсов между источниками, которое вы должны включить в соответствующих доменах.

http://enable-cors.org/

Как сказано в MDN:

Примечание. Хотя EventSource еще не является частью стандарта, он поддерживает CORS в Firefox 11 и более поздних версиях. Ожидается, что вскоре это станет стандартом.

person Simon Sarris    schedule 27.12.2012
comment
Это не работает. Access-Control-Allow-Origin:d2.example.com теперь отображается в заголовке ответа. Тем не менее, EventSource("http://d2.example.com/subscribe") по-прежнему выдает ту же ошибку. я использую Хром - person wael34218; 27.12.2012
comment
1) CORS + EventSource теперь является частью стандарта; 2) CORS + EventSource поддерживается в FF 11+, Opera 12+ и будет в Chrome 25; 3) вы используете полифилл с поддержкой CORS для EventSource - person 4esn0k; 28.12.2012
comment
У вас есть источник для этого? - person Golo Roden; 07.03.2014