Выполнение обработчика голанга Gorilla CORS
У меня довольно простая настройка здесь, как описано в приведенном ниже коде. Но я не могу заставить CORS
работать. Я продолжаю получать эту ошибку:
XMLHttpRequest не может загрузить http://localhost: 3000/signup. Ответ на запрос предполетной проверки не проходит проверку контроля доступа: на запрошенном ресурсе присутствует заголовок Access- Control-Allow-Origin]. Происхождение ' http://localhost: 8000 ', следовательно, не допускается. В ответе был код статуса HTTP 403.
Я уверен, что мне не хватает чего-то простого здесь.
Вот код, который у меня есть:
package main
import (
"log"
"net/http"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
"myApp/src/controllers"
)
func main() {
ac := new(controllers.AccountController)
router := mux.NewRouter()
router.HandleFunc("/signup", ac.SignUp).Methods("POST")
router.HandleFunc("/signin", ac.SignIn).Methods("POST")
log.Fatal(http.ListenAndServe(":3000", handlers.CORS()(router)))
}
Ответы
Ответ 1
Пожалуйста, прочитайте ссылку, предложенную Маркусом, а также о том, что запускает предполетные запросы CORS.
Предполетные запросы: у вас может быть тип контента, такой как JSON, или какой-то другой пользовательский заголовок, который запускает предполетный запрос, который ваш сервер может не обрабатывать. Попробуйте добавить этот, если вы используете постоянно используемый AJAX в своем интерфейсе: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Requested-With
Gorilla handlers.CORS()
установит разумные значения по умолчанию, чтобы основы CORS работали для вас; тем не менее, вы можете (и, возможно, должны) взять на себя управление более функциональным способом.
Вот некоторый стартовый код:
// Where ORIGIN_ALLOWED is like 'scheme://dns[:port]', or '*' (insecure)
headersOk := handlers.AllowedHeaders([]string{"X-Requested-With"})
originsOk := handlers.AllowedOrigins([]string{os.Getenv("ORIGIN_ALLOWED")})
methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})
// start server listen
// with error handling
log.Fatal(http.ListenAndServe(":" + os.Getenv("PORT"), handlers.CORS(originsOk, headersOk, methodsOk)(router)))
Ответ 2
Вы должны создать объект CORSOption
. Например, чтобы разрешить любое происхождение, используйте этот код:
corsObj:=handlers.AllowedOrigins([]string{"*"})
Затем вы передаете этот объект своей функции handle.CORS
:
log.Fatal(http.ListenAndServe(":3000", handlers.CORS(corsObj)(router)))
Для тестирования вы можете использовать CURL:
curl -H "Origin: http://example.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: X-Requested-With" \
-X OPTIONS --verbose http://127.0.0.1:3000
Когда это работает, вы должны увидеть эти заголовки:
> Accept: */*
> Origin: http://example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With
Конечный код находится здесь: https://play.golang.org/p/AOrlJsWhvf
Больше информации:
Ответ 3
Вы можете получить более подробную информацию здесь: "Нет заголовка" Access-Control-Allow-Origin "присутствует в запрошенном ресурсе" об этой проблеме.
Также попробуйте этот обработчик: Go Cors Handler, который должен решить вашу проблему. Я считаю, что это намного проще и легко решить проблему.
package main
import (
"log"
"net/http"
"github.com/rs/cors"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
"myApp/src/controllers"
)
func main() {
ac := new(controllers.AccountController)
router := mux.NewRouter()
router.HandleFunc("/signup", ac.SignUp).Methods("POST")
router.HandleFunc("/signin", ac.SignIn).Methods("POST")
c := cors.New(cors.Options{
AllowedOrigins: []string{"http://localhost:8000"},
AllowCredentials: true,
})
handler := c.Handler(router)
log.Fatal(http.ListenAndServe(":3000", handler )
}
Ответ 4
package main
import (
"log"
"net/http"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
"myApp/src/controllers"
"github.com/rs/cors"
)
func main() {
ac := new(controllers.AccountController)
router := mux.NewRouter()
router.HandleFunc("/signup", ac.SignUp).Methods("POST")
router.HandleFunc("/signin", ac.SignIn).Methods("POST")
//cors optionsGoes Below
corsOpts := cors.New(cors.Options{
AllowedOrigins: []string{"http://localhost:8100"}, //you service is available and allowed for this base url
AllowedMethods: []string{
http.MethodGet,//http methods for your app
http.MethodPost,
http.MethodPut,
http.MethodPatch,
http.MethodDelete,
http.MethodOptions,
http.MethodHead,
},
AllowedHeaders: []string{
"*",//or you can your header key values which you are using in your application
},
})
http.ListenAndServe(":3000", corsOpts.Handler(router))
}