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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Я решил эту проблему следующим образом:

Добавьте это в свой код 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");

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

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

РЕДАКТИРОВАТЬ: Попробуйте (без вашего взлома), чтобы узнать, получаете ли вы данные...

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

Ответ 3

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

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

Ответ 4

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

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

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

II. Верните его обратно, перезагрузите приложение, если API-интерфейсы успешны, остановитесь здесь, не нужно переходить к iii.

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

IV. В новом Chrome ранее установленный плагин CORS должен быть там, но с статусом OFF.

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

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

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

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

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

Ответ 6

Убедитесь, что вы не разрешили учетные данные и установите заголовок разрешения источника *. Как ниже:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Это не будет работать. Если для параметра Access-Control-Allow-Credentials значение true, вы не сможете использовать * в качестве значения заголовка Access-Control-Allow-Origin. Ниже приводится выдержка из веб-документов MDN для заголовка (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin):

For requests without credentials, the literal value "*" can be specified, as a wildcard; 
the value tells browsers to allow requesting code from any origin to access the resource. 
Attempting to use the wildcard with credentials will result in an error.

Если это так, просто установите для Access-Control-Allow-Credentials значение false.

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: false

Рекомендации

Ответ 7

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