使 golang Gorilla CORS 处理程序工作

新手上路,请多包涵

我在这里有相当简单的设置,如下面的代码所述。但我无法让 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)))
}

原文由 Moon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 560
2 个回答

请阅读 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)))

原文由 jeremiah.trein 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以在此处获得更多详细信息: 当我的 JavaScript 代码出现时,为什么 Postman 没有出现“请求的资源上不存在‘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)
}

原文由 user5906464 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏