首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置HTTP标头

设置HTTP标头
EN

Stack Overflow用户
提问于 2012-10-11 07:39:13
回答 8查看 133.4K关注 0票数 173

我正在尝试在我的Go web服务器中设置一个头文件。我使用的是gorilla/muxnet/http包。

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

这是我的Go代码:

代码语言:javascript
复制
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请求头,就好像它是一个客户端一样--我不太确定如何设置响应头?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-10-11 07:46:18

不要紧,我想通了--我在Header()上使用了Set()方法(哦!)

我的处理程序现在看起来像这样:

代码语言:javascript
复制
func saveHandler(w http.ResponseWriter, r *http.Request) {
    // allow cross domain AJAX requests
    w.Header().Set("Access-Control-Allow-Origin", "*")
}

也许这会在某一天对像我这样缺乏咖啡因的人有所帮助:)

票数 239
EN

Stack Overflow用户

发布于 2014-07-18 14:37:52

以上所有答案都是错误的,因为它们无法处理OPTIONS印前检查请求,解决方案是覆盖多路复用路由器的接口。请参阅AngularJS $http get request failed with custom header (alllowed in CORS)

代码语言:javascript
复制
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)
}
票数 98
EN

Stack Overflow用户

发布于 2013-12-20 17:43:28

不要使用'*‘作为Origin,除非你真的需要一个完全公开的行为。

作为Wikipedia says

"*“的值是特殊的,因为它不允许请求提供凭据,这意味着HTTP身份验证、客户端SSL证书,也不允许发送cookies。

这意味着,你会得到很多错误,特别是在Chrome中,当你试图实现例如简单的身份验证时。

下面是一个经过修正的包装器:

代码语言:javascript
复制
// 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)
    }
}

别忘了回复所有这些头文件到印前检查选项请求。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12830095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档