使golang Gorilla CORS处理程序工作

Moo*_*oon 21 go cors gorilla servemux

我在这里设置相当简单,如下面的代码所述.但我无法CORS上班.我一直收到这个错误:

XMLHttpRequest无法加载http:// localhost:3000/signup.对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许来源' http:// localhost:8000 '访问.响应具有HTTP状态代码403.

我相信我在这里缺少一些简单的东西.

这是我的代码:

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
    "myApp/src/controllers"
)

func main() {
    ac := new(controllers.AccountController)

    router := mux.NewRouter()
    router.HandleFunc("/signup", ac.SignUp).Methods("POST")
    router.HandleFunc("/signin", ac.SignIn).Methods("POST")

    log.Fatal(http.ListenAndServe(":3000", handlers.CORS()(router)))
}
Run Code Online (Sandbox Code Playgroud)

jer*_*ein 35

请阅读Markus建议的链接,以及触发CORS飞行前请求的内容.

飞行前请求:您可能拥有类似JSON的内容类型,或者其他一些触发飞行前请求的自定义标头,您的服务器可能无法处理这些请求.如果你在前端使用常见的AJAX,请尝试添加这个:https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Requested-With

Gorilla handlers.CORS()将设置合理的默认设置,让CORS的基础知识为您服务; 但是,你可以(也许应该)以更实用的方式控制.

这是一些入门代码:

// Where ORIGIN_ALLOWED is like `scheme://dns[:port]`, or `*` (insecure)
headersOk := handlers.AllowedHeaders([]string{"X-Requested-With"})
originsOk := handlers.AllowedOrigins([]string{os.Getenv("ORIGIN_ALLOWED")})
methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})

// start server listen
// with error handling
log.Fatal(http.ListenAndServe(":" + os.Getenv("PORT"), handlers.CORS(originsOk, headersOk, methodsOk)(router)))
Run Code Online (Sandbox Code Playgroud)

  • 只是一些簿记:Safari在执行"非标准"操作(例如"PUT")时喜欢发送`Content-Type`请求头,所以你要让你的CORS头允许`Content-Type`为好.`headersOk:= handlers.AllowedHeaders([] string {"X-Requested-With","Content-Type"})`[Gorilla CORS包中的相关参考](https://github.com/gorilla/handlers/blob /master/cors.go#L170) (3认同)

Ami*_*ein 16

你应该创建一个CORSOption对象.例如,要允许任何来源,请使用此代码:

corsObj:=handlers.AllowedOrigins([]string{"*"})
Run Code Online (Sandbox Code Playgroud)

然后将此对象传递给您的handle.CORS函数:

log.Fatal(http.ListenAndServe(":3000", handlers.CORS(corsObj)(router)))
Run Code Online (Sandbox Code Playgroud)

为了测试它你可以使用CURL:

curl -H "Origin: http://example.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: X-Requested-With" \
-X OPTIONS --verbose http://127.0.0.1:3000
Run Code Online (Sandbox Code Playgroud)

当它工作时你应该看到这些标题:

> Accept: */*
> Origin: http://example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With
Run Code Online (Sandbox Code Playgroud)

最终代码在这里:https://play.golang.org/p/AOrlJsWhvf

更多信息:


小智 15

您可以在此处获取更多详细信息:"请求的资源上没有'Access-Control-Allow-Origin'标头",关于此问题.

也尝试这个处理程序:Go Cors Handler 应该解决你的问题.我觉得这个问题更清晰,更容易解决.

package main

import (
    "log"
    "net/http"
    "github.com/rs/cors"
    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
    "myApp/src/controllers"
)

func main() {
    ac := new(controllers.AccountController)

    router := mux.NewRouter()
    router.HandleFunc("/signup", ac.SignUp).Methods("POST")
    router.HandleFunc("/signin", ac.SignIn).Methods("POST")

    c := cors.New(cors.Options{
    AllowedOrigins: []string{"http://localhost:8000"},
    AllowCredentials: true,
    })

    handler := c.Handler(router)

    log.Fatal(http.ListenAndServe(":3000", handler )
}
Run Code Online (Sandbox Code Playgroud)


小智 7

声明 mux 对象后,将 accessControlMiddleware 作为中间件添加到声明的对象中。

func main(){
  ac := new(controllers.AccountController)

    router := mux.NewRouter()
    router.Use(accessControlMiddleware)
    router.HandleFunc("/signup", ac.SignUp).Methods("POST")
    router.HandleFunc("/signin", ac.SignIn).Methods("POST")
    http.ListenAndServe(":3000", corsOpts.Handler(router))
}

// access control and  CORS middleware
func accessControlMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            w.Header().Set("Access-Control-Allow-Origin", "*")
            w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS,PUT")
            w.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type")

                if r.Method == "OPTIONS" {
                    return
                }

                next.ServeHTTP(w, r)
            })
        }
Run Code Online (Sandbox Code Playgroud)


and*_*dig 7

我意识到这是一个老问题,但尽管如此,我还是花了 30 分钟才解决这个问题。

handler = handlers.CORS(
    // handlers.AllowedMethods([]string{"GET", "POST", "PUT"}),
    handlers.AllowedHeaders([]string{"Accept", "Accept-Language", "Content-Type", "Content-Language", "Origin"}),
    // handlers.AllowedOrigins([]string{"*"}),
)(handler)
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • AllowedMethods 不需要显式包含OPTIONS,这是 CORS 处理程序的一部分
  • 需要明确提及的AllowedHeaders*不是有效的通配符。Content-Type典型的ajax库会在请求类似的内容时发送application/json,所以也添加它。
  • *是AllowedOrigin的默认值