猿问

设置HTTP头

我正在尝试在Go Web服务器中设置标题。我正在使用gorilla/mux和net/http软件包。


我想设置Access-Control-Allow-Origin: *为允许跨域AJAX。


这是我的Go代码:


func saveHandler(w http.ResponseWriter, r *http.Request) {

// do some stuff with the request data

}


func main() {

    r := mux.NewRouter()

    r.HandleFunc("/save", saveHandler)

    http.Handle("/", r)

    http.ListenAndServe(":"+port, nil)

}

该net/http软件包具有描述发送HTTP请求标头(好像它是客户端)的文档-我不确定如何设置响应标头?


慕神8447489
浏览 180回答 3
3回答

一只萌萌小番薯

以上所有答案都是错误的,因为它们无法处理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)}

慕姐4208626

在真正需要完全公开的行为之前,请勿将“ *”用于“来源”。正如维基百科所说:““ *”的值是特殊的,因为它不允许请求提供凭据,这意味着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请求。
随时随地看视频慕课网APP

相关分类

Go
我要回答