CORS не работает на Chrome


Я настроил совместное использование ресурсов Cross-Origin на сервере (Jetty с помощью CrossOriginFilter), и он отлично работает на IE8 и Firefox. На хроме, это просто ... нет.

  $.ajax({ url : crossOriginURL,
    type : "GET",
    error : function(req, message) {
        alert(message);
    },
    dataType :  "json" } );

Вызывается функция error с полезным сообщением "error". Похоже, он делает запрос, но без каких-либо заголовков, которые вы ожидаете. Если URL-адрес из того же источника, он работает нормально.

5 25

5 ответов:

Я решил свою задачу следующим образом:

Добавьте это в свой PHP-код:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true ");
header("Access-Control-Allow-Methods: OPTIONS, GET, POST");
header("Access-Control-Allow-Headers: Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control");

Или добавьте эти заголовки в свой ответ.

Проблема: браузеры запрашивают у сервера параметры перед вашим основным запросом, чтобы проверить, есть ли у сайта возможность разрешить связь с другим источником, а затем, если да, они делают ваш пост или получают запрос.

EDIT: Попробуйте это (без вашего взлома), чтобы увидеть, получаете ли Вы данные...

$.ajax({ url : crossOriginURL,
    type : "GET",
    error : function(req, message) {
        alert(message);
    },
    success : function(data) {
        alert(data);
    },
    dataType :  "text"} );

Похоже, что оригинальный плакат, возможно, решил их проблему, но для тех, кто имеет ту же проблему, что и commentor Elisabeth, я считаю, что проблема может заключаться в том, что Chrome отказывается устанавливать заголовок источника для запроса CORS, если вы запускаете запрос из локального файла. Он даже не позволит вам явно переопределить заголовок Origin. Это приводит к тому, что сервер видит "Origin: null", что в большинстве случаев приводит к 403. Firefox, по-видимому, не имеет такого ограничения, как я обнаружил после многих дергание за волосы.

Если Вам абсолютно необходимо использовать Chrome в этом случае, вы можете решить вашу проблему, запустив веб-сервер локально и всегда получая доступ к вашему файлу через http:, а не через file:.

То, что в конце концов сработало для меня, - это xhr.setRequestHeader('Content-Type', 'text/plain');

В моем случае это localhost: 8001 (внешний интерфейс), который пытается вызвать API в localhost:7001 (на сервере.js как сервер узла). Даже у меня был установлен плагин CORS и включен на Chrome, но политика CORS отвергла их как предполетные случаи.

Мне потребовалось больше половины дня, чтобы окончательно решить эту проблему. Вот "глупые" шаги, хотите верьте, хотите нет:

I. выключите CORS плагин, перезагрузите приложение, в это время вы все равно должны получить ошибки, которые являются правильный.

Второй. Включите его, обновите приложение, если API успешны, остановитесь, не нужно переходить к третьей.

Iii. однако если вы все еще получаете отказ CORS, то удалите Chrome и установите обновленный Chrome.

Ив. На новый хром, ранее установленный плагин ПДБС-прежнему должен быть там, но в выключенном состоянии.

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

Ви. Включите его, перезагрузите страница, ошибки должны исчезнуть.

Никаких дальнейших идей, Если вышеуказанные шаги все еще не работают в вашем случае.

Я также попробовал следующее на сервере.js (Node) и до сих пор не работают, поэтому не утруждайте себя попытками:

var app = express();
var cors = require('cors'); // Already done “npm i cors --save-dev”
app.options('*', cors());

CORS будет работать в chrome. Просто используйте chrome в безопасном режиме, то есть используйте отключить настройки безопасности. Погуглите его об этом, или вы даже можете начать из командной строки также.