從外部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 中的中間件用於在請求和回應到達處理程序之前攔截並修改它們。但是,當多個中間件組件修改相同標頭時,可能會導致在回應中設定該標頭的多個實例。 考慮以下範例中間件:
當此中間件與設定“伺服器”標頭的其他中間件一起使用,它會在回應中產生多個“伺服器”標頭。
自訂ResponseWritertype 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中文網其他相關文章!