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.
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.
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() }
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) }) }
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!