CORS не работает на Chrome - PullRequest
29 голосов
/ 29 июня 2010

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

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

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

Ответы [ 7 ]

24 голосов
/ 30 августа 2010

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

Добавьте это в свой код 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"} );
13 голосов
/ 31 октября 2012

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

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

12 голосов
/ 29 августа 2011

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

0 голосов
/ 10 мая 2019

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

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

Список литературы

0 голосов
/ 20 апреля 2019

Когда я обновил Chrome, я столкнулся с проблемой, я решил ее в новой версии расширения Google «Access-Control-Allow-Credentials».если это старая версия, вам не нужно будет работать с новой версией Google Chrome

https://chrome.google.com/webstore/detail/access-control-allow-cred/hmcjjmkppmkpobeokkhgkecjlaobjldi?hl=en

0 голосов
/ 11 октября 2017

В моем случае это localhost: 8001 (внешний интерфейс), который пытается вызвать 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());
0 голосов
/ 27 мая 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...