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
자격 증명 요청에 응답 할 때 서버는 도메인을 지정해야하며 와일드 카드를 사용할 수 없습니다.
답변
Chrome에서 Ajax 요청을 신속하게 해결해야하는 경우이 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
});
여기 두 개의 참조 링크가 있습니다
답변
@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())