Происхождение <origin> не разрешено Access-Control-Allow-Origin

104
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, пока моя страница загружается с сервера node. Что является самым простым и безопасным (не хотите запускать хром с опцией disable-web-security). Если мне нужно изменить 'Content-Type', должен ли я сделать это на сервере node? Как?

Теги:
google-chrome
cors

10 ответов

118
Лучший ответ

Поскольку они работают на разных портах, они отличаются JavaScript origin. Не имеет значения, что они находятся на одном компьютере/имени хоста.

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

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

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

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

Access-Control-Allow-Origin: *
  • 0
    если мы хотим добавить этот заголовок в HTML, что мы должны сделать для него?
  • 0
    @AzamAlvi: используйте файл .htaccess. stackoverflow.com/q/10640596 :-)
Показать ещё 5 комментариев
42

Вы должны включить 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. как к Allow-CORS-в-экспресс-nodejs
  2. dive-into-node-js-very-first-app # смотрите раздел Ajax
  • 0
    config.allowedDomains ли вы указать, как использовать config.allowedDomains . скажи в моем случае, что URI я должен поставить там?
  • 0
    Кстати, я использую экспресс
Показать ещё 3 комментария
40

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

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

  • 3
    Я не знаю, почему вы не получаете больше голосов. Это наименее навязчиво для разработки на локальном хосте с Chrome.
  • 0
    определенно согласен. Легко включить локальный dev для удаленного сервера без необходимости изменения конфигурации удаленного сервера.
Показать ещё 4 комментария
6

Я принимаю ответ @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.

3

Я столкнулся с проблемой при вызове ресурса перекрестного происхождения, используя ajax из chrome.

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

Я получал сообщение об ошибке, когда я получаю доступ к ресурсу перекрестного происхождения

Я нашел одно решение,

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

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

2) На моей странице html, называемой ресурсом Cross origin, с помощью $.getJSON();

$.getJSON("http://localhost:3000/users", function (data) {
    alert("*******Success*********");
    var response=JSON.stringify(data);
    alert("success="+response);
    document.getElementById("employeeDetails").value=response;
});
1
In router.js just add code before calling get/post methods. It works for me without errors.

//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();
  });
1

Я наконец получил ответ для 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

Добавьте это на ваш сервер 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();
});
0

Если после этого вы получили 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>
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               

Ещё вопросы

Сообщество Overcoder
Наверх
Меню