programing

여기서 "origin is not allow by Access-Control-Allow-Origin" 오류가 나타나는 이유는 무엇입니까?

lastcode 2023. 2. 17. 19:41
반응형

여기서 "origin is not allow by Access-Control-Allow-Origin" 오류가 나타나는 이유는 무엇입니까?

다음의 에러가 표시됩니다.

Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin

다음 코드 포함:

var http = new getXMLHttpRequestObject();
var url = "http://gdata.youtube.com/action/GetUploadToken";
var sendXML = '<?xml version="1.0"?><entry xmlns="http://www.w3.org/2005/Atom"'+
    'xmlns:media="http://search.yahoo.com/mrss/'+
    'xmlns:yt="http://gdata.youtube.com/schemas/2007">'+
    '<media:group><media:title type="plain">My First API</media:title>'+
    '<media:description type="plain">First API</media:description>'+
    '<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>'+
    '<media:keywords>first, api</media:keywords></media:group></entry>';
http.open("POST", url, true);
http.setRequestHeader("Authorization", "AuthSub token=" + AccessToken);
http.setRequestHeader("X-GData-Key", "key="+ dev_key);
http.setRequestHeader("Content-Type", "application/atom+xml; charset=UTF-8");

http.onreadystatechange = function() {
    if(http.readyState == 4) {
        alert(http.responseXML);
    }
}
http.send(sendXML);

원인은 무엇이며, 어떻게 해결할 수 있습니까?

현재 도메인 외부에서 Ajax 요청을 할 경우 Javascript가 제한됩니다.

  • 예 1: 당신의 도메인은 example.com이며, test.com = > 에 요청을 할 수 없습니다.
  • 예 2: 당신의 도메인은 example.com이며, inner.example.com = > 에 요청을 할 수 없습니다.
  • 예 3: 당신의 도메인은 example.com:80이며, example.com:81 = >에 요청하고자 하는 경우, 할 수 없습니다.
  • EX 4: 당신의 도메인은 example.com이며, example.com = >에 요청을 할 수 있습니다.

Javascript는 보안상의 이유로 "동일 원본 정책"에 의해 제한되므로 악의적인 스크립트가 원격 서버에 접속하여 중요한 데이터를 전송할 수 없습니다.

jsonp는 javascript를 사용하는 다른 방법입니다.요청을 하면 결과는 클라이언트에서 실행되는 콜백 함수에 캡슐화됩니다.새로운 스크립트 태그를 html의 선두에 링크하는 것과 같습니다(여기에서는 다른 도메인에서 스크립트를 로드할 수 있습니다).
다만, jsonp 를 사용하려면 , 서버가 올바르게 설정되어 있을 필요가 있습니다.그렇지 않으면 jsonp를 사용할 수 없으며 서버 측 프록시(PHP, ASP 등)에 의존해야 합니다.이 토픽에 관한 가이드가 많이 있습니다.구글을 검색해 주세요!

XMLHttpRequest가 도달하지 않음localhost:8080"동일 원산지 정책" 때문입니다.

응답에 헤더를 추가하여 최신 브라우저의 요청을 허용할 수 있습니다.localhost:8080:

Access-Control-Allow-Origin: *

HTTP 서버에 디렉티브를 추가하거나 서버측 코드(PHP, Ruby 등)를 통해 헤더를 추가함으로써 이를 수행할 수 있습니다.

크로스 오리진 에이잭스 요청에 대한 자세한 내용은 https://developer.mozilla.org/en/http_access_control를 참조하십시오.

Chrome을 사용하는 경우 간단한 회피책(개발 목적으로만)은 옵션을 사용하는 것입니다.--disable-web-security.

솔루션에 global.asax를 추가합니다.

더하다

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

protected void Application_BeginRequest(object sender, EventArgs e)
{
}

apache를 사용하고 있는 경우는, 퍼블릭 루트에 .htaccess 파일을 삽입/작성해, 필요한 파일 확장자를 추가합니다.

<FilesMatch "\.(ttf|otf|eot|woff|jpg|png|jpeg|gif|js|json|html|css)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

로컬 개발의 경우 HTTP 응답 헤더를 수정하는 도구를 사용할 수 있습니다.를 들어 Charles는 포함된 개서 도구를 사용하여 이를 수행할 수 있습니다.개서 도구

대상 도메인/위치에 대한 새 규칙을 추가합니다.

Type: Add Header
Where: Response
Replace
     Name: Access-Control-Allow-Origin
     Value: *
Replace All

여기서는 Apache Http를 위해 두 가지 작업을 수행해야 합니다.

1) httpd.config 파일에서 이 파일의 코멘트를 해제합니다.

LoadModule headers_module modules/mod_headers.so

2) 하단에 이 행을 추가합니다.

Header set Access-Control-Allow-Origin "*"

만약 당신이 브라우저로 구글 크롬을 사용하고 있다면, 당신은 CORS 확장자를 추가하고 활성화 할 수 있습니다, 그것은 당신의 코드에 아무것도 바꾸지 않고 구멍 문제를 해결할 것입니다.

이 질문과는 무관하지만 이 상황에서 jQuery를 사용하는 사용자는... 때 「jQuery」를 합니다.callback=?

자바 배경의 경우 자바스크립트를 위한 웹 서비스를 호출하는 서블릿을 만드는 것이 하나의 해결책일 수 있습니다.GET(Your-choice) 메서드의 아래 코드와 같은 것...

JsonElement jelement;
    JsonArray jarray;
    try {
        URL url = new URL("http://rest."YOUR URL"#ba0482");
        URLConnection connection = url.openConnection();
        connection.setDoInput(true);
        InputStream inStream = connection.getInputStream();
        BufferedReader input = new BufferedReader(new InputStreamReader(inStream));

        jelement = new JsonParser().parse(input);

        jarray = jelement.getAsJsonArray();

        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        out.print(jarray);
        out.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

이제 javascript에서 서블릿 이름으로 URL을 지정하기만 하면 됩니다!!

ajax를 사용하여 php 페이지에 접속할 때 동일한 오류 메시지가 나타납니다(javascript와 php 파일은 모두 같은 서버에 있습니다).

이유는 자바스크립트에서 IP 주소를 도메인으로 지정했기 때문입니다.이로 인해 브라우저는 php 파일에 대한 호출이 다른 서버에 있다고 믿게 되었습니다.

이 에러 메시지를 간단하게 제거할 수 있습니다.a) javascript와 php 파일이 같은 서버 b에 있는지 확인합니다.JavaScript의 URL(특히 도메인)이 서버의 URL(http://www.smartana.co.uk/myServer.php) 등)을 반영하고 있는지 확인합니다.

언급URL : https://stackoverflow.com/questions/9310112/why-am-i-seeing-an-origin-is-not-allowed-by-access-control-allow-origin-error

반응형