小编典典

如何在Go服务器上处理预检CORS请求

go

所以我用Go编写了这个RESTful后端,它将通过跨站点HTTP请求来调用,即从另一个站点(实际上,只是另一个端口,但是同源策略启动了,所以我们来了)提供的内容中调用。

在这种情况下,在某些情况下,用户代理将发送预检OPTIONS请求,以检查实际请求是否可以安全发送。

我的问题是如何在Go上下文中最好地处理和充分响应这些预检请求。我构想的方法感觉不太优雅,我想知道是否还有其他我没有想到的方法。

使用标准net/http包,我可以在处理程序函数中检查请求方法,也许像这样:

func AddResourceHandler(rw http.ResponseWriter, r *http.Request) {
  switch r.Method {
  case "OPTIONS":
    // handle preflight
  case "PUT":
    // respond to actual request
  }
}

我还可以使用Gorilla的
mux程序包,并为每个相关的URL路径注册一个预检“ OPTIONS”处理程序。

r := mux.NewRouter()
r.HandleFunc("/someresource/item", AddResourceHandler).Methods("PUT")
r.HandleFunc("/someresource/item", PreflightAddResourceHandler).Methods("OPTIONS")

也许对这个问题的回答很简单:是的 ,这些是您的基本选择。 但是我认为可能有一些我不知道的最佳实践。


阅读 300

收藏
2020-07-02

共1个答案

小编典典

分离逻辑并重新使用定义的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))
2020-07-02