Источник <origin> не разрешен Access-Control-Allow-Origin

184
XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin. 

Я прочитал о междоменных запросах ajax и понял основную проблему безопасности. В моем случае 2 сервера работают локально, и им нравится включать междоменные запросы во время тестирования.

localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server

Я отправляю запрос ajax, localhost:8080 - GAE serverпока моя страница загружается с сервера узлов. Что является самым простым и безопасным (не хочу запускать Chrome с disable-web-securityопцией). Если я должен измениться 'Content-Type', я должен сделать это на сервере узла? Как?

BSR
источник
Более быстрое решение можно найти здесь: stackoverflow.com/a/21622564/4455570
Габриэль Вамунью

Ответы:

195

Так как они работают на разных портах, они разные JavaScript origin. Неважно, что они находятся на одной машине / имени хоста.

Вам необходимо включить CORS на сервере (localhost: 8080). Проверьте этот сайт: http://enable-cors.org/

Все, что вам нужно сделать, это добавить HTTP-заголовок на сервер:

Access-Control-Allow-Origin: http://localhost:3000

Или, для простоты:

Access-Control-Allow-Origin: *

Мысль не используйте "*", если ваш сервер пытается установить cookie, и вы используете withCredentials = true

при ответе на запрос учетных данных сервер должен указать домен и не может использовать групповые символы.

Вы можете прочитать больше о withCredentialsздесь

Ракета Хазмат
источник
если мы хотим добавить этот заголовок в HTML, что мы должны сделать для него?
Азам Алви
1
Я не думал, что этот порт был необходим, но если вы используете нестандартный порт, такой как 3000, вы должны включить его в политику CORS.
Майкл Коннор
4
Спасибо за этот ответ. Просто хочу подчеркнуть последствия для безопасности использования '*' в качестве значения здесь. Это позволяет все источники: developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… Похоже, что первый пример будет лучшим с точки зрения наименьшего доступа. Подробная информация о том, как сделать это с несколькими доменами здесь: stackoverflow.com/a/1850482/1566623
Кристофер Куттруфф
14
Для ясности, когда говорится, что вам нужно «добавить HTTP-заголовок на сервер», это означает, что данный Access-Control-Allow-Originзаголовок должен быть добавленным заголовком к HTTP-ответам, которые отправляет сервер. Этот заголовок должен быть частью ответа сервера, он не должен быть частью запроса клиента . В частности, то, что происходит, прежде чем клиент сделает фактический запрос, который вы хотите, браузер отправляет OPTIONSзапрос перед ним, и если ответ сервера на этот OPTIONSзапрос не содержит заголовок, браузер не будет отправлять желаемый запрос.
AjaxLeung
1
Важно прочитать соответствующие советы для ваших внутренних серверов на сайте enable-cors.org.
Карл
69

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

Расширение Chrome Allow-Control-Allow-Origin: *

Билли Бейкер
источник
6
Я не знаю, почему вы не получаете больше голосов. Это наименее навязчиво для разработки на localhost с Chrome.
Дэвид Бец
определенно согласен. Легко включить для локального разработчика против удаленного сервера без необходимости изменения конфигурации для удаленного сервера.
Дженс Вегар
@DavidBetz: учитывая, что вы проверяете расширение и доверяете ему, конечно;)
Хайлем
2
ЭТО ДОЛЖНО БЫТЬ ТОП-ОТВЕТОМ! Особенно в том, что касается localhost.
г-н Бенедикт
16
Если бы это было хорошее решение, CORS не был бы изобретен во-первых. Применение этого заголовка к любому хосту отключает защиту CORS и подвергает вас воздействию не только ваших, но и вредоносных сценариев. Не удивляйтесь, если ваш банковский счет внезапно опустеет.
Дольмен
54

Вы должны включить CORS, чтобы решить эту проблему

если ваше приложение создано с помощью простого node.js

установите его в заголовках вашего ответа, как

var http = require('http');

http.createServer(function (request, response) {
response.writeHead(200, {
    'Content-Type': 'text/plain',
    'Access-Control-Allow-Origin' : '*',
    'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE'
});
response.end('Hello World\n');
}).listen(3000);

если ваше приложение создано с помощью экспресс-фреймворка

использовать промежуточное программное обеспечение CORS, как

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', "*");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
}

и подать заявку через

app.configure(function() {
    app.use(allowCrossDomain);
    //some other code
});    

Вот две ссылки

  1. как к-разрешения CORS-в-экспресс-nodejs
  2. dive-into-node-js-very-first-app # смотри раздел Ajax
mithunsatheesh
источник
Можете ли вы указать, как использовать config.allowedDomains. скажи в моем случае, что Ури я должен поставить там?
2013 г.
@bsr: вы можете использовать *или specific domainвы хотите дать доступ.
Mithunsatheesh
1
так я только один получаю app.configure()не ошибка функции?
Прамеш Баджрачарья
@PrameshBajrachaya Я не включил «app.configure» только для части «app.use (allowCrossDomain)», и он работал для меня.
Гиоргос Сфикас
8

Я принимаю ответ @Rocket hazmat, который привел меня к решению. Это было действительно на сервере GAE, мне нужно было установить заголовок. Я должен был установить эти

"Access-Control-Allow-Origin" -> "*"
"Access-Control-Allow-Headers" -> "Origin, X-Requested-With, Content-Type, Accept"

установка только "Access-Control-Allow-Origin" дала ошибку

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers.

Кроме того, если маркер авторизации должен быть отправлен, добавьте это тоже

"Access-Control-Allow-Credentials" -> "true"

Также на клиенте установите withCredentials

это вызывает 2 запроса на отправку на сервер, один с OPTIONS. Auth cookie не отправляется вместе с ним, поэтому нужно обрабатывать сторонние auth.

BSR
источник
7

В router.js просто добавьте код перед вызовом методов get / post. У меня работает без ошибок.

//Importing modules @Brahmmeswar
const express = require('express');
const router = express.Router();

const Contact = require('../models/contacts');

router.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
  });
Брахмесвара Рао Палепу
источник
5

Я столкнулся с проблемой при вызове ресурса перекрестного источника с использованием ajax из Chrome.

Я использовал узел js и локальный сервер http для развертывания приложения js узла.

Я получаю сообщение об ошибке при доступе к ресурсу кросс-источника

Я нашел одно решение по этому вопросу,

1) Я добавил приведенный ниже код в мой файл app.js

res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");

2) В моей html-странице, называемой ресурсом перекрестного происхождения, используется $.getJSON();

$.getJSON("http://localhost:3000/users", function (data) {
    alert("*******Success*********");
    var response=JSON.stringify(data);
    alert("success="+response);
    document.getElementById("employeeDetails").value=response;
});
Chaitanya
источник
5

Если вы используете Express, вы можете использовать промежуточное программное обеспечение Cors следующим образом:

var express = require('express')
var cors = require('cors')
var app = express()

app.use(cors())
Akalanka Weerasooriya
источник
3

Добавьте это на ваш сервер NodeJS ниже импорта:

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
Райан Кокуццо
источник
3

Если после этого вы получили 403, уменьшите фильтры в конфиге WEB.XML tomcat до следующего:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
</filter>
Фарбод Априн
источник
2

Я наконец получил ответ для Apache Tomcat8

Вы должны отредактировать файл tomcat web.xml.

вероятно, это будет внутри папки webapps,

sudo gedit /opt/tomcat/webapps/your_directory/WEB-INF/web.xml

найти и отредактировать

<web-app>


<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>


<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>



</web-app>

Это позволит Access-Control-Allow-Origin всем хостам. Если вам нужно изменить его со всех хостов на только хост, вы можете отредактировать

<param-name>cors.allowed.origins</param-name>
<param-value>http://localhost:3000</param-value>

вышеуказанный код от * до вашего http: // your_public_IP или http://www.example.com

Вы можете обратиться сюда к документации фильтра Tomcat.

Спасибо

Синтоистский Иосиф
источник
1

Привет Это способ решения проблемы CORS в узле. Просто добавьте эти строки на стороне сервера "api" в Node.js (или в любом другом файле вашего сервера), прежде чем обязательно установить "cors".

    const express = require('express');
    const app = express();
    app.use(express.json());
    var cors = require('cors');
    app.use(cors());
Саад Аббаси
источник
0

используйте dataType: 'jsonp', у меня работает.

   async function get_ajax_data(){

       var _reprojected_lat_lng = await $.ajax({

                                type: 'GET',

                                dataType: 'jsonp',

                                data: {},

                                url: _reprojection_url,

                                error: function (jqXHR, textStatus, errorThrown) {

                                    console.log(jqXHR)

                                },

                                success: function (data) {

                                    console.log(data);



                                    // note: data is already json type, you just specify dataType: jsonp

                                    return data;

                                }

                            });





 } // function               
hoogw
источник
0

Для PHP используйте это, чтобы установить заголовки.

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
Хамза Валид
источник
0
router.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "*");
res.header("Access-Control-Allow-Headers", "*");
next();});

добавьте это к вашим маршрутам, которые вы вызываете из внешнего интерфейса. Например, если вы вызываете http: // localhost: 3000 / users / register, вы должны добавить этот фрагмент кода в свой внутренний файл .js, который лежит по этому маршруту.

Сужева К. Абейсингхе
источник
0

Если кто-то ищет решение, если вы используете экспресс здесь, это быстрое решение.

const express = require('express')
const cors = require('cors')
const app = express()

1) установить cors с помощью npm npm install cors --save

2) импортировать его [требуется] const cors = require('cors')

3) использовать его как промежуточное ПО app.use(cors())

для получения подробной информации и использования Cors . Вот и все, надеюсь, это работает.

Бадри Паудель
источник