如果您不想覆盖您的路由器(如果您没有以支持此功能的方式配置您的应用程序,或者想要逐个路由配置 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 Method OPTIONS 的预检请求,您必须在路由器中显式处理该请求,然后,如果它"Access-Control-Allow-Origin": origin
从您的应用程序接收到适当的响应(或“*”),它会启动实际的要求。
我也相信您只能对标准类型的请求(即:GET)执行“*”,但对于其他请求,您必须像我上面那样明确设置来源。