3 回答
TA贡献1795条经验 获得超7个赞
以上所有答案都是错误的,因为它们无法处理OPTIONS预检请求,解决方案是覆盖多路复用器路由器的接口。请参阅AngularJS $ http获取带有自定义标头的请求失败(在CORS中允许)
func main() {
r := mux.NewRouter()
r.HandleFunc("/save", saveHandler)
http.Handle("/", &MyServer{r})
http.ListenAndServe(":8080", nil);
}
type MyServer struct {
r *mux.Router
}
func (s *MyServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
if origin := req.Header.Get("Origin"); origin != "" {
rw.Header().Set("Access-Control-Allow-Origin", origin)
rw.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
rw.Header().Set("Access-Control-Allow-Headers",
"Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}
// Stop here if its Preflighted OPTIONS request
if req.Method == "OPTIONS" {
return
}
// Lets Gorilla work
s.r.ServeHTTP(rw, req)
}
TA贡献1852条经验 获得超7个赞
在真正需要完全公开的行为之前,请勿将“ *”用于“来源”。
正如维基百科所说:
““ *”的值是特殊的,因为它不允许请求提供凭据,这意味着HTTP身份验证,客户端SSL证书,也不允许发送cookie。”
这意味着您会遇到很多错误,尤其是在Chrome中,当您尝试实现简单的身份验证时,就会遇到很多错误。
这是一个更正的包装器:
// Code has not been tested.
func addDefaultHeaders(fn http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if origin := r.Header.Get("Origin"); origin != "" {
w.Header().Set("Access-Control-Allow-Origin", origin)
}
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token")
w.Header().Set("Access-Control-Allow-Credentials", "true")
fn(w, r)
}
}
并且不要忘记将所有这些标头答复给preflight OPTIONS请求。
- 3 回答
- 0 关注
- 179 浏览
添加回答
举报