교차 오리진 요청 차단됨
따라서 일부 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
'programing' 카테고리의 다른 글
테스트 중에 Spring Boot에서 /tmp/spring.log 파일을 사용 (0) | 2023.07.31 |
---|---|
대각선 스트립의 다각측량 행렬 (0) | 2023.07.31 |
Asp.net Core의 Ajax 도우미 태그 설명서 (0) | 2023.07.31 |
Null DATE 필드에 대한 MariaDB LOAD DATA INFILE (0) | 2023.07.31 |
외부 웹 사이트에서 제목 및 메타 태그 가져오기 (0) | 2023.07.31 |