作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
所以我在 Go 中编写了这个 RESTful 后端,它将被跨站点 HTTP 请求调用,即来自另一个站点提供的内容(实际上,只是另一个端口,但同源策略生效,所以在这里我们是)。
在这种情况下,在某些情况下,用户代理会发送预检 OPTIONS 请求以检查实际请求是否可以安全发送。
我的问题是如何在 Go 上下文中最好地处理和充分响应这些预检请求。我构思的方式感觉不是很优雅,我想知道是否还有其他我没有想到的方法。
使用标准的net/http
包,我可以检查handler func中的请求方法,大概是这样的:
func AddResourceHandler(rw http.ResponseWriter, r *http.Request) {
switch r.Method {
case "OPTIONS":
// handle preflight
case "PUT":
// respond to actual request
}
}
我也可以使用 Gorilla's mux
包,并为每个相关的 URL 路径注册一个预检“OPTIONS”处理程序。
r := mux.NewRouter()
r.HandleFunc("/someresource/item", AddResourceHandler).Methods("PUT")
r.HandleFunc("/someresource/item", PreflightAddResourceHandler).Methods("OPTIONS")
也许对这个问题的回答很简单:是的,这些是你的基本选择。但我认为可能有一些我不知道的最佳实践。
最佳答案
分离逻辑并重用您定义的 CORS 处理程序的一种简单方法是包装您的 REST 处理程序。例如,如果你使用 net/http 和 Handle
方法,你总是可以这样做:
func corsHandler(h http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if (r.Method == "OPTIONS") {
//handle preflight in here
} else {
h.ServeHTTP(w,r)
}
}
}
你可以这样包装:
http.Handle("/endpoint/", corsHandler(restHandler))
关于go - 如何在 Go 服务器上处理预检 CORS 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22972066/
我是一名优秀的程序员,十分优秀!