Я создал демо, используя JavaScript для API поиска фотографий Flickr. Теперь я конвертирую его в AngularJs. Я искал в Интернете и нашел ниже конфигурации.
Конфигурация:
myApp.config(function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
});
Обслуживание:
myApp.service('dataService', function($http) {
delete $http.defaults.headers.common['X-Requested-With'];
this.flickrPhotoSearch = function() {
return $http({
method: 'GET',
url: 'http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=3f807259749363aaa29c76012fa93945&tags=india&format=json&callback=?',
dataType: 'jsonp',
headers: {'Authorization': 'Token token=xxxxYYYYZzzz'}
});
}
});
контроллер:
myApp.controller('flickrController', function($scope, dataService) {
$scope.data = null;
dataService.flickrPhotoSearch().then(function(dataResponse) {
$scope.data = dataResponse;
console.log($scope.data);
});
});
Но все же я получил ту же ошибку. Вот несколько ссылок, которые я пробовал:
XMLHttpRequest не может загрузить URL. Происхождение не разрешено Access-Control-Allow-Origin
Ответы:
Вы не Сервер, к которому вы обращаетесь, должен внедрить CORS для предоставления доступа JavaScript с вашего сайта. Ваш JavaScript не может предоставить разрешение на доступ к другому веб-сайту.
источник
https://www.google.com
использования приложения , как POSTMAN, но когда я пытаюсьGET
сhttps://www.google.com
помощью вызова AJAX я получаю ошибку CORS? Разве я не могу заставить вызов AJAX вести себя так же, как вызов POSTMAN?У меня была аналогичная проблема , и для меня это сводилось к добавлению следующих HTTP заголовки в ответ на приемном конце :
Вы можете предпочесть не использовать
*
в конце, а только имя домена хоста, отправляющего данные. подобно*.example.com
Но это возможно только тогда, когда у вас есть доступ к конфигурации сервера.
источник
header('Access-Control-Allow-Origin: *');
Http.get()
или аналогичного значения, добавьтеheader('Access-Control-Allow-Origin: *')
в качестве самого первого вывода в вызываемый PHP-сценарий (т.Попробуйте использовать службу ресурсов, чтобы использовать flickr jsonp:
Шаблон:
источник
Эта проблема возникает из-за политики модели безопасности веб-приложения, которая является той же самой политикой происхождения. В соответствии с этой политикой веб-браузер разрешает сценариям, содержащимся на первой веб-странице, доступ к данным на второй веб-странице, но только если обе веб-страницы имеют одинаковое происхождение. Это означает, что запрашивающий должен точно указать хост, протокол и порт запрашивающего сайта.
У нас есть несколько вариантов решения этой проблемы с заголовком CORS.
Использование прокси- сервера. В этом решении мы запустим прокси-сервер таким образом, что при запросе через прокси он будет выглядеть так, как будто он имеет некое происхождение. Если вы используете nodeJS вы можете использовать Корс в любом месте , чтобы сделать прокси вещи. https://www.npmjs.com/package/cors-anywhere .
Пример : -
JSONP - JSONP - это метод отправки данных JSON, не беспокоясь о междоменных проблемах. Он не использует объект XMLHttpRequest. Вместо него используется
<script>
тег. https://www.w3schools.com/js/js_json_jsonp.aspНа стороне сервера - на стороне сервера мы должны включить запросы кросс-происхождения. Сначала мы получим Предварительно просвеченные запросы (ОПЦИИ), и нам нужно разрешить запрос с кодом состояния 200 (хорошо).
Предварительно выданные запросы сначала отправляют заголовок запроса HTTP OPTIONS ресурсу в другом домене, чтобы определить, безопасен ли фактический запрос для отправки. Межсайтовые запросы предварительно просматриваются следующим образом, поскольку они могут иметь значение для пользовательских данных. В частности, запрос предварительно выдан, если он использует методы, отличные от GET или POST. Кроме того, если POST используется для отправки данных запроса с Content-Type, отличным от application / x-www-form-urlencoded, multipart / form-data или text / plain, например, если запрос POST отправляет полезную нагрузку XML на сервер используя application / xml или text / xml, запрос предварительно просвечивается. Он устанавливает пользовательские заголовки в запросе (например, запрос использует заголовок, такой как X-PINGOTHER)
Если вы используете пружину, просто добавьте приведенный ниже код, чтобы решить проблему. Здесь я отключил токен csrf, который не имеет значения, включить / отключить в соответствии с вашими требованиями.
Если вы используете систему безопасности Spring, используйте приведенный ниже код вместе с приведенным выше кодом.
источник
Я столкнулся с подобной проблемой, как эта, проблема была с бэкэндом. Я использовал узел сервера (Express). У меня был запрос get от внешнего интерфейса (угловой), как показано ниже
Но это дало следующую ошибку
Это внутренний код, написанный с использованием Express без заголовков.
После добавления заголовка в метод проблема была решена
Вы можете получить более подробную информацию о включении CORS на Node JS
источник
Ответил сам.
CORS угловой js + restEasy на POST
Ну, наконец, я пришел к этому обходному пути: причина, по которой он работал с IE, заключается в том, что IE отправляет непосредственно запрос POST, а не предварительный запрос, чтобы запросить разрешение. Но я до сих пор не знаю, почему фильтр не смог управлять запросом OPTIONS и отправляет заголовки по умолчанию, которые не описаны в фильтре (похоже, переопределение для этого единственного случая ... может быть, restEasy ... .)
Поэтому я создал путь OPTIONS в моей службе отдыха, который переписывает ответ и включает заголовки в ответ, используя заголовок ответа.
Я все еще ищу чистый способ сделать это, если кто-нибудь сталкивался с этим раньше.
источник
Apache / HTTPD обычно присутствует на большинстве предприятий или если вы используете Centos / etc дома. Так что, если у вас это есть, вы можете очень легко создать прокси, чтобы добавить необходимые заголовки CORS.
У меня есть пост в блоге по этому вопросу здесь, поскольку я страдал с ним довольно много раз в последнее время. Но важный момент - это просто добавить это в файл /etc/httpd/conf/httpd.conf и убедиться, что вы уже выполняете «Listen 80»:
Это гарантирует, что все запросы к URL-адресам вашего-server-ip: 80 / SomePath направляются на http: // target-ip: 8080 / SomePath (API без поддержки CORS) и что они возвращаются с правильным Access-Control-Allow- Исходный заголовок, позволяющий им работать с вашим веб-приложением.
Конечно, вы можете изменить порты и настроить таргетинг на весь сервер, а не на SomePath, если хотите.
источник
Этот ответ описывает два способа обхода API, которые не поддерживают CORS:
Одним из способов решения этой проблемы является использование CORS PROXY:
Для получения дополнительной информации см.
Используйте JSONP, если API поддерживает это:
DEMO на PLNKR
Для получения дополнительной информации см.
источник
источник
мы можем включить CORS во внешнем интерфейсе с помощью модуля ngResourse. Но самое главное, мы должны иметь этот кусок кода при выполнении запроса AJAX в контроллере,
Кроме того, вы должны добавить ngResourse CDN в части скрипта и добавить в качестве зависимости в модуль приложения.
Затем используйте «ngResourse» в разделе зависимостей модуля приложения
var routerApp = angular.module("routerApp", ["ui.router", 'ngResource']);
источник