Origin <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поки моя сторінка завантажується з сервера вузлів. Що є найпростішим і найбезпечнішим (не хочу запускати хром з disable-web-securityопції). Якщо мені доведеться змінити 'Content-Type', чи потрібно це робити на сервері вузлів? Як?


Більш швидке рішення можна знайти тут: stackoverflow.com/a/21622564/4455570
Габріель Wamunyu

Відповіді:


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
Крістофер Kuttruff

14
Для наочності, коли говориться, що вам потрібно "додати HTTP-заголовок до сервера", це означає, що даний Access-Control-Allow-Originзаголовок повинен бути доданим заголовком до відповідей HTTP, які сервер надсилає. Цей заголовок повинен бути частиною відповіді сервера, він не повинен бути частиною запиту клієнта . Зокрема, це відбувається, перш ніж клієнт зробить потрібний фактичний запит, браузер надсилає OPTIONSзапит перед ним, і якщо відповідь сервера на цей OPTIONSзапит не містить заголовка, браузер не надішле потрібний вам запит.
AjaxLeung

1
Важливо прочитати відповідні поради для ваших серверних серверів на веб-сайті enable-cors.org.
Карлт

69

Якщо вам потрібна швидка робота з Chrome для запитів на ajax, цей хромований плагін автоматично дозволяє вам отримати доступ до будь-якого сайту з будь-якого джерела, додавши відповідний заголовок відповіді

Розширення Chrome Allow-Control-Allow-Origin: *


6
Я не знаю, чому ви не отримуєте більше грошей. Це найменш настирливий для розробки на локальному хості з Chrome.
Девід Бетц

однозначно згоден. Легко увімкнути локальний розробник на віддаленому сервері, не змінюючи конфігурацію для віддаленого сервера.
Єнс Вегар

@DavidBetz: звичайно, ви підтверджуєте розширення і довіряєте йому, звичайно;)
haylem

2
ЦЕ ПОТРІБНО ВІДПОВІСТЬ! Тим більше, що стосується місцевого господаря.
Пан Бенедикт

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-in-express-nodejs
  2. зануритися у вузол-js-дуже-перший-додаток # див. розділ Аякс

Ви можете вказати, як користуватися config.allowedDomains. скажіть у моєму випадку, що урі я повинен туди поставити?
bsr

@bsr: ви можете використовувати *або до якого specific domainви хочете надати доступ.
mithunsatheesh

1
тож я єдиний, хто отримує, app.configure()це не помилка функції?
Прамеш Байрачаря

@PrameshBajrachaya Я не включав "app.configure" частину - лише "app.use (enableCrossDomain)", і це працювало для мене.
Giorgos Sfikas

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. Аутентичне cookie не надсилається разом із ним, отже, потрібно обробляти сторонні аутентифікатори.


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.

Я використовував node js та локальний http-сервер для розгортання своєї програми njs 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;
});

5

Якщо ви використовуєте експрес, ви можете використовувати проміжне програмне забезпечення cors таким чином:

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

app.use(cors())

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, зменшіть фільтри в налаштуваннях tomcat WEB.XML до наступного:

<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               

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) встановити корси за допомогою npm npm install cors --save

2) імпортувати його [вимагати] const cors = require('cors')

3) використовувати його як проміжне програмне забезпечення app.use(cors())

для детальної інформації про використання та використання диска . Це все, сподіваємось, це працює.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.