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

标签 http go cors gorilla

当使用 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” header 在请求的资源上。
使用 rs.cors 不是必需的,但在某些情况下,如果没有它,我无法成功地让 CORS 工作。
这是一些示例代码:

package main

import (
    "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 是否会更好,我可以为此提出另一个问题!

最佳答案

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

rtr := mux.NewRouter()
rtr.HandleFunc("/test", test).Methods("GET")
handler := cors.Default().Handler(limitMiddleware(rtr))
http.ListenAndServe(":3021", handler)

关于http - 使用 rs.cors 时返回 http 状态码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63083339/

相关文章:

asp.net - 在 ASP.Net 中编写自定义 NTLM 质询/响应

javascript - Angular http 发布错误 : Cannot read property 'post' of undefined

file - Golang判断*File是指向文件还是目录

json - 如何解析不变的 json var 名称

node.js - 尽管未设置 Access-Control-Allow-Credentials,但我收到 CORS 错误

javascript - 从本地驱动器建立 API 连接

javascript - Safari 10.1 : XMLHttpRequest with query parameters cannot load due to access control checks

http - 我应该调用 evhttp_request_free 来释放 http 服务器中的资源吗?

go - "Memory used"公制 : Go tool pprof vs docker stats

java - AsyncTask 语法错误