<origin> kaynağına Access-Control-Allow-Origin tarafından izin verilmiyor


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

Web alanları arası ajax isteklerini okudum ve temel güvenlik sorununu anladım. Benim durumumda, 2 sunucu yerel olarak çalışıyor ve test sırasında alanlar arası istekleri etkinleştirmek istiyor.

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

Sayfam localhost:8080 - GAE serverdüğüm sunucusundan yüklenirken için bir ajax isteği yayınlıyorum . En kolay ve en güvenli olan nedir (Chrome'u disable-web-securityseçenekle başlatmak istemiyorum ). Değiştirmem 'Content-Type'gerekirse, düğüm sunucusunda mı yapmalıyım? Nasıl?


Daha hızlı bir çözüm burada bulunabilir: stackoverflow.com/a/21622564/4455570
Gabriel Wamunyu

Yanıtlar:


195

Farklı bağlantı noktalarında çalıştıklarından, farklı JavaScriptlerdir origin. Aynı makine / ana bilgisayar adında olmaları önemli değildir.

Sunucuda CORS'yi etkinleştirmeniz gerekir (localhost: 8080). Bu siteye göz atın: http://enable-cors.org/

Tek yapmanız gereken sunucuya bir HTTP başlığı eklemek:

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

Veya basitlik için:

Access-Control-Allow-Origin: *

Sunucunuz çerez ayarlamaya çalışıyorsa ve " withCredentials = true

kimlik bilgisi talebine yanıt verirken, sunucunun bir etki alanı belirtmesi gerekir ve joker karakter kullanamaz.

withCredentialsBuradan daha fazla bilgi edinebilirsiniz


bu başlığı bir HTML'ye eklemek istiyorsak, bunun için ne yapmalıyız?
Azam Alvi

1
Bağlantı noktasının gerekli olduğunu düşünmüyordum, ancak 3000 gibi standart dışı bir bağlantı noktası kullanıyorsanız, bunu CORS politikasına dahil etmeniz gerekir.
Michael Connor

4
Bu yanıt için teşekkürler. Burada değer olarak '*' kullanmanın güvenlik üzerindeki etkilerini vurgulamak yeterlidir. Bu, tüm kökenlere izin verir: developer.mozilla.org/en-US/docs/Web/HTTP/Headers/… İlk örnek en az erişim açısından en iyisi gibi görünüyor. Bunu burada birden çok alan
Christopher Kuttruff

14
Açık olmak gerekirse, "sunucuya bir HTTP üstbilgisi eklemeniz gerektiği" söylendiğinde, bu, söz konusu Access-Control-Allow-Originüstbilginin, sunucunun gönderdiği HTTP yanıtlarına ek bir başlık olması gerektiği anlamına gelir . Bu üstbilginin sunucunun yanıtının bir parçası olması, istemcinin isteğinin bir parçası olması gerekmez . Özellikle, istemci istediğiniz OPTIONSisteği yapmadan önce , tarayıcı istemeden önce bir istek gönderir ve sunucunun bu OPTIONSisteğe cevabı başlık içermiyorsa, tarayıcı istediğiniz isteği göndermez.
AjaxLeung

1
Enable-cors.org adresinden arka uç sunucularınız için ilgili ipuçlarını okumanız önemlidir.
Karlth

69

Ajax istekleri için Chrome'da hızlı bir çalışmaya ihtiyacınız varsa, bu krom eklentisi, uygun yanıt başlığını ekleyerek herhangi bir kaynaktan herhangi bir siteye otomatik olarak erişmenizi sağlar

Chrome Uzantısı Allow-Control-Allow-Origin: *


6
Neden daha fazla oy almadığınızı bilmiyorum. Bu, Chrome ile localhost üzerinde geliştirme için en az müdahalecidir.
David Betz

kesinlikle katılıyorum. Uzak sunucu yapılandırmasını değiştirmek zorunda kalmadan, uzak sunucuya karşı localhost geliştirmeyi etkinleştirmek kolaydır.
Jens Wegar

@DavidBetz: uzantıyı doğruladığınızı ve elbette ona güveneceğinizi
düşünerek

2
BU YANIT CEVAPI OLMALIDIR! Özellikle localhost söz konusu olduğunda.
Bay Benedict

16
Bu iyi bir çözüm olsaydı, ilk olarak CORS icat edilmeyecekti. Bu üstbilgiyi herhangi bir ana bilgisayara uygulamak CORS korumasını devre dışı bırakır ve sizi yalnızca sizinki değil kötü amaçlı komut dosyalarına maruz bırakır. Banka hesabınız aniden boşsa şaşırmayın.
dolmen

54

Bunu çözmek için CORS'u etkinleştirmelisiniz

uygulamanız basit node.js ile oluşturulmuşsa

yanıt başlıklarınızda

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);

uygulamanız ekspres çerçeve ile oluşturulmuşsa

gibi bir CORS ara katmanı kullanın

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

ve üzerinden başvur

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

İşte iki referans bağlantısı

  1. nasıl yapılır-izin-cors-in-express-nodejs
  2. Düğüm-içine-js-çok-ilk-uygulama # Ajax bölümüne bakın

nasıl kullanacağınızı belirtebilir misiniz config.allowedDomains? benim durumumda ne uri koymalıyım?
BSR

@bsr: kullanabilirsiniz *veya specific domainerişim izni vermek istersiniz.
mithunsatheesh

1
yani ben sadece app.configure()bir fonksiyon hatası değil mi alıyorum?
Pramesh Bajracharya

@PrameshBajrachaya "app.configure" yalnızca bölüm "app.use (allowCrossDomain)" ifadesini dahil etmedim ve benim için çalıştı.
Giorgos Sfikas

8

@Rocket hazmat'ın cevabı beni çözüme götürdüğü için kabul ediyorum. Başlığı ayarlamak için gereken GAE sunucusundaydı. Bunları ayarlamak zorundaydım

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

ayar sadece "Access-Control-Allow-Origin" hata verdi

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

Ayrıca, yetkilendirme jetonunun gönderilmesi gerekiyorsa, bunu da ekleyin

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

Ayrıca, istemcide, withCredentials

Bu sunucuya bir tane olmak üzere 2 istek gönderilmesine neden olur OPTIONS. Auth tanımlama bilgisi onunla gönderilmez, bu nedenle auth dışında davranmanız gerekir.


7

Router.js'de get / post yöntemlerini çağırmadan önce kodu ekleyin. Benim için hatasız çalışır.

//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

Krom ajax kullanarak çapraz kökenli kaynak çağırırken bir sorunla karşı karşıya kaldım.

Düğüm js uygulamasını dağıtmak için düğüm js ve yerel http sunucusu kullandım.

Kaynaklar arası kaynağa eriştiğimde hata yanıtı alıyordum

Bu konuda bir çözüm buldum,

1) app.js dosyama aşağıdaki kodu ekledim

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

2) html sayfamda çapraz kaynak kullanarak $.getJSON();

$.getJSON("http://localhost:3000/users", function (data) {
    alert("*******Success*********");
    var response=JSON.stringify(data);
    alert("success="+response);
    document.getElementById("employeeDetails").value=response;
});

5

Express kullanıyorsanız, cors ara katman yazılımını aşağıdaki gibi kullanabilirsiniz:

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

app.use(cors())

3

Aşağıdakileri aşağıdaki NodeJS Sunucunuza ekleyin:

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

Bundan sonra 403'ünüz varsa lütfen WEB.XML tomcat config'teki filtreleri aşağıdakilere azaltın:

<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

Sonunda apache Tomcat8'in cevabını aldım

Tomcat web.xml dosyasını düzenlemeniz gerekir.

muhtemelen webapps klasörünün içinde olacak,

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

bul ve düzenle

<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>

Bu, tüm ana bilgisayarlara Erişim-Kontrol-İzin Ver-Kökenli izin verir. Tüm ana bilgisayarlardan yalnızca ana makinenize değiştirmeniz gerekirse,

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

* 'den http: // your_public_IP veya http://www.example.com adresinize yukarıdaki kod

Tomcat filtre belgelerine buradan ulaşabilirsiniz

Teşekkürler


1

Merhaba Bu düğüm CORS sorunu çözmek için yol Sadece Node.js sunucu "api" tarafında bu satırları ekleyin (ya da herhangi bir sunucu dosyası), "cors" yüklediğinizden emin olun

    const express = require('express');
    const app = express();
    app.use(express.json());
    var cors = require('cors');
    app.use(cors());

0

dataType kullanın: 'jsonp', benim için çalışıyor.

   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 için, üstbilgileri ayarlamak için bunu kullanın.

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

bunu ön uçtan aradığınız rotalara ekleyin. Örneğin, http: // localhost: 3000 / users / register'ı çağırırsanız, bu kod parçasını bu yolun yerleştirdiği arka uç .js dosyanıza eklemeniz gerekir.


0

Herkes çözüm arıyor durumunda, burada ekspres kullanıyorsanız hızlı çözümdür.

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

1) npm kullanarak korleri takın npm install cors --save

2) ithalat [gerektirir] const cors = require('cors')

3) ara katman yazılımı olarak kullanın app.use(cors())

detaylar için korseler ve kullanımı . İşte bu, umarım işe yarar.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.