首頁 > 後端開發 > Golang > 如何在 Go 中間件中重寫 HTTP 標頭而不重複?

如何在 Go 中間件中重寫 HTTP 標頭而不重複?

Barbara Streisand
發布: 2024-12-03 16:29:11
原創
494 人瀏覽過

How to Override HTTP Headers in Go Middleware Without Duplication?

從外部Go 中間件覆蓋HTTP 標頭

後台

後台

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)
    })
}
登入後複製
Go 中的中間件用於在請求和回應到達處理程序之前攔截並修改它們。但是,當多個中間件組件修改相同標頭時,可能會導致在回應中設定該標頭的多個實例。

考慮以下範例中間件:

當此中間件與設定“伺服器”標頭的其他中間件一起使用,它會在回應中產生多個“伺服器”標頭。

自訂ResponseWriter
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()
}
登入後複製

要解決此問題,我們可以建立一個自訂ResponseWriter,它會攔截WriteHeader() 呼叫並在進一步傳遞請求之前設定適當的標頭。
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)
    })
}
登入後複製

透過使用在我們的伺服器中間件中使用這個自訂的 ResponseWriter,我們可以確保「Server」標頭僅設定一次。 這個解決方案允許我們從外部中間件控制 HTTP 標頭,而不違反 ServeHTTP 的語意。

以上是如何在 Go 中間件中重寫 HTTP 標頭而不重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板