programing

교차 오리진 요청 차단됨

bestprogram 2023. 7. 31. 21:33

교차 오리진 요청 차단됨

따라서 일부 POST 콘텐츠를 데이터스토어에 저장하고 응답으로 다른 정보를 검색하는 Go http 핸들러가 있습니다.사용하는 백엔드:

func handleMessageQueue(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
    if r.Method == "POST" {

        c := appengine.NewContext(r)

        body, _ := ioutil.ReadAll(r.Body)

        auth := string(body[:])
        r.Body.Close()
        q := datastore.NewQuery("Message").Order("-Date")

        var msg []Message
        key, err := q.GetAll(c, &msg)

        if err != nil {
            c.Errorf("fetching msg: %v", err)
            return
        }

        w.Header().Set("Content-Type", "application/json")
        jsonMsg, err := json.Marshal(msg)
        msgstr := string(jsonMsg)
        fmt.Fprint(w, msgstr)
        return
    }
}

파이어폭스 OS 앱에서 다음을 사용합니다.

var message = "content";

request = new XMLHttpRequest();
request.open('POST', 'http://localhost:8080/msgs', true);

request.onload = function () {
    if (request.status >= 200 && request.status < 400) {
        // Success!
        data = JSON.parse(request.responseText);
        console.log(data);
    } else {
        // We reached our target server, but it returned an error
        console.log("server error");
    }
};

request.onerror = function () {
    // There was a connection error of some sort
    console.log("connection error");
};

request.send(message);

들어오는 부품은 모두 같이 작동합니다.하지만, 저의 응답이 차단되고 있습니다.다음 메시지를 보냅니다.

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8080/msgs. This can be fixed by moving the resource to the same domain or enabling CORS.

다른 것들도 많이 시도해봤지만, 서버에서 답변만 받을 수 있는 방법이 없습니다.하지만 Go POST 방식을 GET로 변경하고 브라우저를 통해 페이지에 접속하면 원하는 데이터가 너무 많이 나옵니다.저는 어느 쪽이 잘못되었는지, 왜 잘못되었는지 결정할 수 없습니다. Go가 이런 종류의 요청을 차단해서는 안 되지만, 제 자바스크립트가 불법일 수도 있습니다.

@Egidius, XMLHttpRequest를 생성할 때 다음을 사용해야 합니다.

var xhr = new XMLHttpRequest({mozSystem: true});

mozSystem이란 무엇입니까?

mozSystem 부울:이 플래그를 true로 설정하면 서버가 CORS를 사용하여 선택할 필요 없이 사이트 간 연결을 수행할 수 있습니다.mozAnon을 설정해야 합니다. true. 즉, 쿠키 또는 다른 사용자 자격 증명을 보내는 것과 결합할 수 없습니다.이 기능은 권한이 있는(검토된) 앱에서만 작동하며 Firefox에 로드된 임의 웹 페이지에서는 작동하지 않습니다.

매니페스트의 변경 사항

매니페스트에서 다음 행을 권한에 포함하는 것을 잊지 마십시오.

"permissions": {
       "systemXHR" : {},
}

액세스 제어 허용 오리진뿐만 아니라 다른 헤더도 필요합니다.요청에 "Access-Control-Allow-Origin" 헤더가 있는 경우, 이 헤더를 응답 헤더에 복사해야 합니다. 그렇지 않은 경우, "Origin" 헤더를 확인하고 응답에 복사해야 합니다.요청에 오리진이 아닌 Access-Control-Allow-Origin 헤더가 없는 경우 "*"를 반환해야 합니다.

자세한 설명은 여기에서 확인할 수 있습니다. http://www.html5rocks.com/en/tutorials/cors/ #toc-session-support-to-the-server

그리고 이것이 제가 사용하는 교차 도메인 헤더 작성 기능입니다.

func writeCrossDomainHeaders(w http.ResponseWriter, req *http.Request) {
    // Cross domain headers
    if acrh, ok := req.Header["Access-Control-Request-Headers"]; ok {
        w.Header().Set("Access-Control-Allow-Headers", acrh[0])
    }
    w.Header().Set("Access-Control-Allow-Credentials", "True")
    if acao, ok := req.Header["Access-Control-Allow-Origin"]; ok {
        w.Header().Set("Access-Control-Allow-Origin", acao[0])
    } else {
        if _, oko := req.Header["Origin"]; oko {
            w.Header().Set("Access-Control-Allow-Origin", req.Header["Origin"][0])
        } else {
            w.Header().Set("Access-Control-Allow-Origin", "*")
        }
    }
    w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
    w.Header().Set("Connection", "Close")

}

이 코드를 application.rb에 넣어야 합니다.

config.action_dispatch.default_headers = {
        'Access-Control-Allow-Origin' => '*',
        'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}

언급URL : https://stackoverflow.com/questions/22363268/cross-origin-request-blocked