ホームページ  >  記事  >  バックエンド開発  >  Go ミドルウェアで競合するサーバー ヘッダーをオーバーライドするにはどうすればよいですか?

Go ミドルウェアで競合するサーバー ヘッダーをオーバーライドするにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-26 19:43:11141ブラウズ

How Can I Override Conflicting Server Headers in Go Middleware?

Go ミドルウェアでのサーバー ヘッダーのオーバーライド

背景

Go ではミドルウェアを使用できますHTTP リクエストとレスポンスを処理および変更します。ただし、HTTP ヘッダーを制御するサーバー ミドルウェアを追加するときに、他のハンドラーもサーバー ヘッダーを設定すると、応答に複数のサーバー ヘッダーが存在するという問題が発生する可能性があります。

考えられる解決策

  • カスタム ResponseWriter ラッパー: カスタム 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 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)
    })
}
  • ミドルウェアの順序を逆にする: ミドルウェアの順序を逆にして、サーバーミドルウェアは最後に存在するため、サーバーに対する最終的な決定権を持ちます。 header.
  • Inner-Most Middleware: あるいは、サーバー ミドルウェアを最も内側のミドルウェアにして、外部ハンドラーによって設定された他のヘッダーをインターセプトしてオーバーライドできるようにします。

追加メモ

  • カスタムResponseWriter ラッパー アプローチでは新しいタイプが導入されており、コードのメンテナンスがもう少し必要になります。
  • サーバー ミドルウェアを逆にするか、最も内側にすると、ミドルウェア チェーンの意図したフローが変更される可能性があります。
  • 推奨されるソリューションは状況によって異なります。アプリケーションの特定の要件と複雑さについて説明します。

以上がGo ミドルウェアで競合するサーバー ヘッダーをオーバーライドするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。