登录
首页 >  Golang >  Go问答

代理中间件 Echo CORS 的 Access-Allow-Origins 响应标头存在问题

来源:stackoverflow

时间:2024-03-03 12:48:25 401浏览 收藏

大家好,今天本人给大家带来文章《代理中间件 Echo CORS 的 Access-Allow-Origins 响应标头存在问题》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

我正在使用 labstack 的 golang echo 框架来构建服务。

其中一个路由需要代理来自后端服务的请求和响应。

但我也需要 cors 来处理此服务。

因此,我在请求/响应堆栈中使用 middleware.corswithconfigmiddleware.proxywithconfig

我发现 access-control-allow-origins 标头有些奇怪,其中从代理服务到我的 echo 服务器 * 的响应中该标头的值,但是一旦它通过代理,它就会当它返回到客户端时,更改为 *、*。 之后我开始看到以下与 cors 违规相关的浏览器错误:

vm1627:362 access to xmlhttprequest at 'http://localhost:6273/' from origin 'http://localhost:8002' has been blocked by cors policy: the 'access-control-allow-origin' header contains multiple values '*, *', but only one is allowed.

有人遇到过这种情况吗?任何人都知道为什么会发生这种情况以及可能有解决方法吗?

这是一些示例代码:

package main

func singleTargetBalancer(url *url.URL) middleware.ProxyBalancer {
    targetURL := []*middleware.ProxyTarget{
        {
            URL: url,
        },
    }
    return middleware.NewRoundRobinBalancer(targetURL)
}

func Noop(ctx echo.Context) (err error) {
    ctx.String(
        http.StatusNotImplemented,
        "No op handler should never be reached!",
    )

    return err
}

func main() {
        e := echo.New()
    e.HideBanner = true
    e.Use(
        middleware.CORSWithConfig(middlewares.CustomCorsConfig),
        middlewares.ThriftMetrics(),
    )

        // Have to use a Noop handler since we're not trying to set up a full-on proxy for the backend service.  We only want this one route to be proxied.
        e.POST(
        "/",
        handlers.Noop,
        middleware.ProxyWithConfig(middleware.ProxyConfig{
             Balancer: singleTargetBalancer("[backend service URL]"),
            })
    )
}

解决方案


我最终通过编写一个自定义的 echo 中间件来解决这个问题,以便在 echo 的代理中间件将标头发送回客户端之前挂钩到响应。

func setresponseacaoheaderfromrequest (req http.request, resp echo.response) {
    resp.header().set(echo.headeraccesscontrolalloworigin, 
    req.header.get(echo.headerorigin))
}

func acaoheaderoverwritemiddleware(next echo.handlerfunc) echo.handlerfunc {
    return func(ctx echo.context) error {
        ctx.response().before(func() {
            setresponseacaoheaderfromrequest(*ctx.request(), *ctx.response())
        })
        return next(ctx)
    }
}

然后只需将此中间件放入 e.use() right 中,位于代理中间件之前:

e.POST(
        "/",
        handlers.Noop,
        ACAOHeaderOverwriteMiddleware,
        middleware.ProxyWithConfig(middleware.ProxyConfig{
             Balancer: singleTargetBalancer("[backend service URL]"),
        })
)

echo 的 request::before() 挂钩文档:https://echo.labstack.com/guide/response#before-response

好了,本文到此结束,带大家了解了《代理中间件 Echo CORS 的 Access-Allow-Origins 响应标头存在问题》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>