라우터를 재정의하지 않으려는 경우 경우 (이를 지원하는 방식으로 앱을 구성하지 않았거나 경로별로 경로에 CORS를 구성하려는 경우) OPTIONS 핸들러를 추가하여 사전 비행 요청을 처리하십시오. .
즉, Gorilla Mux를 사용하는 경로는 다음과 같습니다.
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
위의 POST 핸들러 외에도 특정 OPTIONS 메소드 핸들러를 정의하고 있습니다.
그런 다음 OPTIONS 프리 플라이트 방법을 실제로 처리하기 위해 AccountsCreatePreFlight를 다음과 같이 정의 할 수 있습니다.
// Check the origin is valid.
origin := r.Header.Get("Origin")
validOrigin, err := validateOrigin(origin)
if err != nil {
return err
}
// If it is, allow CORS.
if validOrigin {
w.Header().Set("Access-Control-Allow-Origin", origin)
w.Header().Set("Access-Control-Allow-Methods", "POST")
w.Header().Set("Access-Control-Allow-Headers",
"Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}
실제로 CORS의 작동 방식을 이해하는 것 외에도이 모든 것이 나를 위해 클릭 한 것은 프리 플라이트 요청의 HTTP 메소드가 실제 요청의 HTTP 메소드와 다르다는 것입니다. CORS를 시작하기 위해 브라우저는 HTTP 메소드 OPTIONS를 사용하여 프리 플라이트 요청을 전송합니다.이 메소드는 라우터에서 명시 적으로 처리해야합니다. 그런 다음 "Access-Control-Allow-Origin": origin
애플리케이션에서 적절한 응답 (또는 "*")을 받으면 실제로 시작합니다. 의뢰.
또한 표준 유형의 요청 (예 : GET)에 대해서만 "*"를 수행 할 수 있다고 생각하지만 다른 경우에는 위에서처럼 원점을 명시 적으로 설정해야합니다.
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")