[javascript] 오리진 <origin>은 Access-Control-Allow-Origin에 의해 허용되지 않습니다

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

교차 도메인 아약스 요청에 대해 읽고 기본 보안 문제를 이해합니다. 필자의 경우 2 대의 서버가 로컬에서 실행 중이며 테스트 중에 도메인 간 요청을 활성화하고 싶습니다.

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

localhost:8080 - GAE server내 페이지가 노드 서버에서로드되는 동안 아약스 요청을 발행하고 있습니다. 가장 쉽고 안전한 방법은 무엇입니까 ( disable-web-security옵션으로 크롬을 시작하고 싶지는 않음 ). 변경 'Content-Type'해야하는 경우 노드 서버에서 변경 해야합니까? 어떻게?



답변

그것들은 다른 포트에서 실행되기 때문에 다른 JavaScript origin입니다. 이들이 동일한 컴퓨터 / 호스트 이름에 있는지는 중요하지 않습니다.

서버에서 CORS를 활성화해야합니다 (localhost : 8080). 이 사이트를 확인하십시오 : http://enable-cors.org/

서버에 HTTP 헤더를 추가하기 만하면됩니다.

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

또는 간단하게하기 위해 :

Access-Control-Allow-Origin: *

서버가 쿠키를 설정하려고하는데 사용하는 경우 “*”를 사용하지 마십시오. withCredentials = true

자격 증명 요청에 응답 할 때 서버는 도메인을 지정해야하며 와일드 카드를 사용할 수 없습니다.

자세한 내용은 withCredentials여기를 참조 하십시오


답변

Chrome에서 Ajax 요청을 신속하게 해결해야하는 경우이 Chrome 플러그인을 사용하면 적절한 응답 헤더를 추가하여 모든 소스에서 모든 사이트에 자동으로 액세스 할 수 있습니다

Chrome 확장 프로그램 허용 제어 허용 : *


답변

이 문제를 해결하려면 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);

앱이 Express 프레임 워크로 생성 된 경우

같은 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. 표현하는 방법에 방법을 허용하는 법
  2. diving-into-node-js-very-first-app #Ajax 섹션 참조

답변

@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. 인증 쿠키는 함께 전송되지 않으므로 외부 인증을 처리해야합니다.


답변

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


답변

크롬에서 아약스를 사용하여 교차 출처 리소스를 호출하는 동안 문제가 발생했습니다.

노드 js 및 로컬 http 서버를 사용하여 노드 js 앱을 배포했습니다.

교차 출처 리소스에 액세스 할 때 오류 응답이 발생했습니다.

나는 그것에 대한 하나의 해결책을 찾았다.

1) app.js 파일에 아래 코드를 추가했습니다.

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

2) 내 HTML 페이지에서 cross origin resource를 사용하여 $.getJSON();

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


답변

express를 사용하는 경우 다음과 같이 cors 미들웨어를 사용할 수 있습니다.

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

app.use(cors())