如果您不想覆盖路由器(如果您的应用没有以支持此功能的方式进行配置,或者不想按路线配置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方法选项的预检请求,您必须在路由器中显式处理该请求,然后,如果它"Access-Control-Allow-Origin": origin
从应用程序接收到适当的响应(或所有请求都为“ *”),它将启动实际的请求。请求。
我还相信,您只能对标准类型的请求(即GET)执行“ *”,但是对于其他请求,则必须像我上面所做的那样显式设置来源。
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")