我正在尝试在我的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请求头,就好像它是一个客户端一样--我不太确定如何设置响应头?
发布于 2012-10-11 07:46:18
不要紧,我想通了--我在Header()上使用了Set()方法(哦!)
我的处理程序现在看起来像这样:
func saveHandler(w http.ResponseWriter, r *http.Request) {
// allow cross domain AJAX requests
w.Header().Set("Access-Control-Allow-Origin", "*")
}也许这会在某一天对像我这样缺乏咖啡因的人有所帮助:)
发布于 2014-07-18 14:37:52
以上所有答案都是错误的,因为它们无法处理OPTIONS印前检查请求,解决方案是覆盖多路复用路由器的接口。请参阅AngularJS $http get request failed with custom header (alllowed in 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)
}发布于 2013-12-20 17:43:28
不要使用'*‘作为Origin,除非你真的需要一个完全公开的行为。
作为Wikipedia says
"*“的值是特殊的,因为它不允许请求提供凭据,这意味着HTTP身份验证、客户端SSL证书,也不允许发送cookies。
这意味着,你会得到很多错误,特别是在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)
}
}别忘了回复所有这些头文件到印前检查选项请求。
https://stackoverflow.com/questions/12830095
复制相似问题