当前位置: 首页 > 面试题库 >

如何使用带有反向代理的响应标头设置cookie?

陈高寒
2023-03-14
问题内容

假设我在Go中有一个中间件,我想Server用自己的值覆盖任何现有的标头。

// Server attaches a Server header to the response.
func Server(h http.Handler, serverName string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Server", serverName)
        h.ServeHTTP(w, r)
    })
}

然后我将其添加到这样的响应链中

http.Handle("/", authHandler)
http.ListenAndServe(":8000", Server(http.DefaultServeMux, "myapp"))

不幸的是,如果authHandler或由DefaultServeMux调用处理的任何事情w.Header().Add("Server", "foo")(例如,httputil.ReverseProxy.ServeHTTP),我最终在响应中会有两个Server标头。

$ http localhost:5962/v1/hello_world
HTTP/1.1 200 OK
Content-Length: 11
Content-Type: text/plain
Date: Tue, 12 Jul 2016 04:54:04 GMT
Server: inner-middleware
Server: myapp

我真正想要的是这样的:

// Server attaches a Server header to the response.
func Server(h http.Handler, serverName string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        h.ServeHTTP(w, r)
        w.Header().Set("Server", serverName)
    })
}

但是,ServeHTTP的语义不允许这样做:

ServeHTTP应该将回复标头和数据写入ResponseWriter,然后返回。返回信号表明请求已完成;在ServeHTTP调用完成之后或与之同时使用ResponseWriter或从Request.Body中读取是无效的。

我已经看到一些与此有关的丑陋骇客,例如httputil.ReverseProxy.ServeHTTP中的代码,该代码复制标头并重写响应代码,或者使用httptest.ResponseRecorder将整个正文读入字节缓冲区。

我也可以颠倒传统的中间件顺序,并以某种方式将Server中间件放在最后,或者使其成为最内部的中间件。

我缺少任何简单的方法吗?


问题答案:

您可以定义一个自定义类型,该类型将包装ResponseWriter并在写入所有标头之前插入Server标头,但要付出额外的间接层费用。这是一个例子:

type serverWriter struct {
    w           http.ResponseWriter
    name        string
    wroteHeader bool
}

func (s serverWriter) WriteHeader(code int) {
    if s.wroteHeader == false {
        s.w.Header().Set("Server", s.name)
        s.wroteHeader = true
    }
    s.w.WriteHeader(code)
}

func (s serverWriter) Write(b []byte) (int, error) {
    return s.w.Write(b)
}

func (s serverWriter) Header() http.Header {
    return s.w.Header()
}

// Server attaches a Server header to the response.
func Server(h http.Handler, serverName string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        sw := serverWriter{
            w:           w,
            name:        serverName,
            wroteHeader: false,
        }
        h.ServeHTTP(sw, r)
    })
}

我在这里写了更多有关此的内容。https://kev.inburke.com/kevin/how-to-write-go-middleware/



 类似资料:
  • 问题内容: 我需要将CORS设置为在express服务的脚本上启用。如何为公共/资产在这些返回的响应中设置标题? 问题答案: npm上至少有一个中间件用于处理Express中的CORS:cors。[请参阅@mscdex答案] 这是从ExpressJS DOC 设置自定义响应头的方法 将标题字段设置为值 或传递一个对象以一次设置多个字段。 别名为

  • 问题内容: 这段代码在main方法内部。当我运行此代码时,将启动firefox,但不会遵循google url,并且代理未设置为我在上面的代码中指定的代理。我怎样才能解决这个问题? 问题答案: 由于存在错误,您目前无法使用Proxy对象。您应该使用以下代码 该错误已在https://github.com/mozilla/geckodriver/issues/764上讨论,您将在下面的链接中看到Ma

  • 问题内容: 这是我的代码: 但是,当我从浏览器向服务器发出请求时,出现此错误: 我也尝试过这种方法,在请求之后设置响应头: 没有骰子。我犯了同样的错误。有没有一种方法可以只在route函数中设置响应头?这样的事情将是理想的: 但我还是找不到这样做。请帮忙。 编辑 如果我使用POST请求卷曲URL,如下所示: 我得到这个回应: 有任何想法吗? 问题答案: 你可以很容易地做到这一点: 查看和 但是有些

  • 问题内容: 我对python的urllib很陌生。我需要做的是为发送到服务器的请求设置自定义标头。具体来说,我需要设置Content- type和Authorizations标头。我已经研究了python文档,但是找不到。 问题答案: 使用urllib2添加HTTP标头: 从文档:

  • 如果您想使用 Nginx 作为 Gitea 的反向代理服务,您可以参照以下 nginx.conf 配置中 server 的 http 部分: server { listen 80; server_name git.example.com; location / { proxy_pass http://localhost:3000; } } 使用

  • 我们有一个使用node js(express js)构建的web应用程序,它位于nginx后面。 对于特定的API,我们希望将内容类型响应头设置为“text/plain”。控制器中有以下代码。 res.setHeader('Content-Type','text/plain');res.send(响应); 当服务器不在nginx后面时,这是有效的。但是当服务器在nginx后面时,响应头仍然是“应用