Подтвердить что ты не робот

Отказался от установки небезопасного заголовка "Происхождение" при использовании xmlHttpRequest в Google Chrome

Получено это сообщение об ошибке: Refused to set unsafe header "Origin"

Используя этот код:

   function getResponse() {
            document.getElementById("_receivedMsgLabel").innerHTML += "getResponse() called.<br/>";
            if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
                receiveReq.open("GET", "http://L45723:1802", true, "server", "server123");  //must use L45723:1802 at work.
                receiveReq.onreadystatechange = handleReceiveMessage;
                receiveReq.setRequestHeader("Origin", "http://localhost/");
                receiveReq.setRequestHeader("Access-Control-Request-Origin", "http://localhost");
                receiveReq.timeout = 0;
                var currentDate = new Date();
                var sendMessage = JSON.stringify({
                    SendTimestamp: currentDate,
                    Message: "Message 1",
                    Browser: navigator.appName
                });
                receiveReq.send(sendMessage);

            }
        }

Что я делаю неправильно? Что мне недостает в заголовке, чтобы этот запрос CORS работал?

Я попытался удалить вызов receiveReq.setRequestHeader("Origin", ...), но затем Google Chrome выбрал ошибку доступа в моем вызове receiveReq.open()...

Почему?

4b9b3361

Ответ 1

Это просто предположение, поскольку я использую jquery для запросов ajax, включая CORS.

Я думаю, что браузер должен установить заголовок, а не вы. Если вы смогли установить заголовок, это приведет к поражению цели функции безопасности.

Попробуйте запрос без установки этих заголовков и посмотрите, устанавливает ли браузер их для вас.

Ответ 2

В CORS код вызова не должен выполнять какую-либо специальную конфигурацию. Все должно быть обработано браузером. Это задача сервера, чтобы решить, разрешить ли запрос или нет. Поэтому в любое время, когда вы делаете запрос, который нарушает политику SOP, браузер будет пытаться сделать запрос CORS для вас (он автоматически добавит заголовок Origin и, возможно, сделает запрос перед полетом, если вы используете некоторые небезопасные заголовки/методы/типы контента). Если сервер поддерживает CORS, он будет правильно реагировать и разрешить/запретить запрос, предоставив определенные заголовки ответов CORS, например

Access-Control-Allow-Origin: *

Имейте в виду, что Chrome очень ограничивает имя хоста localhost. (По крайней мере, когда я работал с ним). Вместо этого используйте имя своего компьютера или назначьте ему другой псевдоним в файле "hosts". Так, например, не обращайтесь к своему сайту:

http://localhost:port/myappname

Вместо этого используйте:

http://mymachinename:port/myappname

или

http://mymachinealias:port/myappname

Подробнее см. спецификация.

Ответ 3

Вы работаете в кросс-домене?

Попробуйте решение Brian S или попробуйте следующее:

вместо установки на localhost просто передать что-нибудь... и посмотреть, что произойдет.

receiveReq.setRequestHeader("Origin", "*");