#node.js #cross-domain #cors
#node.js #междоменный #cors
Вопрос:
Я пытаюсь создать сервер EventSource с использованием nodejs, который будет обрабатывать междоменные запросы сервера. Я отправляю обратно заголовок 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'
});
Как я могу сделать это правильно?
С уважением
Комментарии:
1. Opera не поддерживает CORS .
2. Возможно, но Chrome поддерживает CORS, и я все еще получаю исключение безопасности (SECURITY_ERR: исключение DOM 18). Я полагаю, что должен быть взлом, например, Acces-Control-Allow-Origin для XHR, но я просто не смог его найти.
3. Хотя w3.org/TR/cors есть раздел, в котором показано, как его можно использовать с SSE, похоже, что браузеры пока проигнорировали его, и на данный момент нет поддержки CORS SSE.
4. Хотелось бы получить подтверждение этого ^, у меня возникли трудности с настройкой заголовков в EventSource XHR.
Ответ №1:
Allow-Credentials
не может использоваться с Allow-Origin
установленным значением *
. Подумайте о том, чтобы написать полученный исходный заголовок в вашем ответе.
Ответ №2:
смотрите https://github.com/Yaffle/EventSource — polyfill может быть использован для поддержки CORS для Firefox, Webkit и IE 8
Ответ №3:
Попробуйте следующий блок вместо вашего. Браузер вызовет один раз с 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();
}
Ответ №4:
Вы получаете Security Exception (SECURITY_ERR: DOM Exception 18)
, если используете междоменные ресурсы. Это может быть связано с :
- попытка доступа к локальным ресурсам через
file://
(локальные файлы не обслуживаются через сервер узла) или - попытка получить доступ к ресурсам с другого сервера, который не разрешает CORS или
- возможно, вы тестируете страницу из локального файла, а не по URL, отправленному с вашего сервера узла.
Ответ №5:
Примечание: При ответе на запрос credentialized requests сервер должен указать источник в значении
Access-Control-Allow-Origin
заголовка вместо указания подстановочного знака «*
«.
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests
Итак:
res.setHeader('Access-Control-Allow-Origin', req.headers.origin)
res.setHeader('Access-Control-Allow-Credentials', 'true')
(на стороне сервера)
если клиентский origin
( req.headers.origin
) является доверенным.
Или просто установите {withCredentials: false}
(на стороне клиента) и используйте res.setHeader('Access-Control-Allow-Origin', '*')
, если вам это не нужно.