为了账号安全,请及时绑定邮箱和手机立即绑定

设置HTTP头

设置HTTP头

Go
慕神8447489 2021-04-30 18:13:28
我正在尝试在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请求标头(好像它是客户端)的文档-我不确定如何设置响应标头?
查看完整描述

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)

}


查看完整回答
反对 回复 2021-05-17
?
慕姐4208626

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请求。


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信