Heim > Backend-Entwicklung > Golang > Wie kann man HTTP-Header in Go Middleware effektiv steuern?

Wie kann man HTTP-Header in Go Middleware effektiv steuern?

Barbara Streisand
Freigeben: 2024-11-29 06:47:13
Original
854 Leute haben es durchsucht

How to Effectively Control HTTP Headers in Go Middleware?

HTTP-Header mit externer Go-Middleware steuern

Problem: Überschreiben von Server-Headern in Middleware

Sie stehen vor einem Szenario, in dem Sie über Middleware in Go verfügen das versucht, einen benutzerdefinierten „Server“-Header festzulegen. Allerdings bleiben vorhandene „Server“-Header, die von der Anwendung oder anderer Middleware festgelegt wurden, bestehen, was zu mehreren „Server“-Headern in der Antwort führt.

Unzulässige Header-Änderung

Gemäß HTTP-Semantik, Änderung von Antwort-Headern nach der Rückkehr der ServeHTTP-Methode ist verboten. Ziel dieser Einschränkung ist es, klare Grenzen zwischen der Bearbeitung von Anfragen und der Fertigstellung von Antworten festzulegen.

Vorgeschlagene Lösungen

1. Benutzerdefinierter ResponseWriter:

Definieren Sie einen benutzerdefinierten ResponseWriter-Wrapper, der Header-Änderungsvorgänge abfängt. Bevor Header geschrieben werden, fügt der Wrapper Ihren benutzerdefinierten „Server“-Header ein. Dieser Ansatz fügt eine zusätzliche Indirektionsebene hinzu, bietet aber eine differenzierte Kontrolle über die Header-Verwaltung.

Hier ist eine Beispielimplementierung eines benutzerdefinierten 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()
}
Nach dem Login kopieren

In der Middleware können Sie dies verwenden Benutzerdefinierter ResponseWriter zur Steuerung des Header-Einfügens:

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)
    })
}
Nach dem Login kopieren

2. Umkehrung der Middleware-Reihenfolge:

Ein alternativer Ansatz besteht darin, die Reihenfolge der Middleware umzukehren, sodass Ihre „Server“-Header-Setting-Middleware nach allen anderen Middleware ausgeführt wird. Dadurch wird sichergestellt, dass Ihre Header-Änderung der letzte Vorgang ist, bevor die Antwort abgeschlossen ist.

3. Innerste Middleware:

Platzieren Sie nach Möglichkeit Ihre „Server“-Header-Setting-Middleware als innerste Middleware-Schicht. Dadurch wird die Möglichkeit ausgeschlossen, dass äußere Middleware den „Server“-Header ändert, nachdem Sie ihn festgelegt haben.

4. Antwortänderung:

Als letzten Ausweg können Sie die Verwendung eines benutzerdefinierten http.Handlers in Betracht ziehen, der die Antwort abfängt und den „Server“-Header entsprechend ändert. Dieser Ansatz erfordert eine sorgfältige Handhabung, um eine Beeinträchtigung anderer Funktionen in Ihrer Anwendung zu vermeiden.

Das obige ist der detaillierte Inhalt vonWie kann man HTTP-Header in Go Middleware effektiv steuern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage