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

使用 rs.cors 时返回 http 状态码

使用 rs.cors 时返回 http 状态码

Go
神不在的星期二 2022-06-21 10:03:18
当使用 rs.cors 在 Go Web 服务上启用 Cors 时,返回 200 以外的 http 状态代码(例如,返回 http.StatusTooManyRequests)会导致 CORS 错误:从源“http://localhost:8080”访问“http://localsrv:3021/test?status=toomany”的 XMLHttpRequest 已被 CORS 策略阻止:不存在“Access-Control-Allow-Origin”标头在请求的资源上。使用 rs.cors 不是必需的,但在某些情况下,如果没有它,我无法成功地让 CORS 工作。这是一些示例代码:package mainimport (    "log"    "net/http"    "github.com/gorilla/mux"    "github.com/rs/cors")func main() {    rtr := mux.NewRouter()    rtr.HandleFunc("/test", test).Methods("GET")    handler := cors.Default().Handler(rtr)    if err := http.ListenAndServe(":3021",        (limitMiddleware(handler))); err != nil {        log.Fatalf("unable to start server: %s", err.Error())    }}func limitMiddleware(next http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        params := r.URL.Query()        if params["status"][0] == "toomany" {            http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests)            return        }        next.ServeHTTP(w, r)    })}func test(w http.ResponseWriter, req *http.Request) {    log.Println("test()")}应该生成 StatusTooManyRequests 的 JavaScript 请求以 CORS 错误而不是 HTTP 429 结束。axios.get("http://okami:3021/test?status=toomany")  .then(res => {    console.log("stuff http://okami:3021/test result",  res);}); //axios有没有办法使用 rs.cors 以便在出现 CORS 问题时启动 CORS,并且在没有 CORS 问题时可以返回 http 错误代码?基本上,除非系统返回 HTTP 200,否则 CORS 会启动。这应该很简单,但我在这个问题上摸不着头脑。让我知道放弃 rs.cors 并改为手动启用 cors 是否会更好,我可以为此提出另一个问题!
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

limitMiddleware 返回的函数在 cors 中间件(下一个参数)之前执行。重新排序您的处理程序:


rtr := mux.NewRouter()

rtr.HandleFunc("/test", test).Methods("GET")

handler := cors.Default().Handler(limitMiddleware(rtr))

http.ListenAndServe(":3021", handler)


查看完整回答
反对 回复 2022-06-21
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

有没有办法使用 rs.cors 以便在出现 CORS 问题时启动 CORS,并且在没有 CORS 问题时可以返回 http 错误代码?


除非你处理 cors,否则你会得到它作为错误,所以这个问题的解决方法是修复 cors。


使用 rs.cors 不是必需的,但在某些情况下,如果没有它,我无法成功地让 CORS 工作。


http.ResponseWriter您可以通过设置Header 值来处理 cors 。你可以这样做


 func getGoogle(w http.ResponseWriter, r *http.Request) {

    w.Header().Set("Access-Control-Allow-Origin", "*")

}

或用您的前端网址替换“*”。


查看完整回答
反对 回复 2022-06-21
?
心有法竹

TA贡献1866条经验 获得超5个赞

您需要指定 Cors,请在您的 main(){ ... } 中尝试此代码


    port := ":9000"

    headers := handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type", "Authorization"})

    methods := handlers.AllowedMethods([]string{"GET", "POST", "PUT", "DELETE"})

    origins := handlers.AllowedOrigins([]string{"*"})


    err = http.ListenAndServe(port, handlers.CORS(headers, methods, origins))

    if err != nil {

        log.Errorf("Error starting server: %s\n", err)

        os.Exit(1)

    }


查看完整回答
反对 回复 2022-06-21
  • 3 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

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