Die http.TimeoutHandler
dient nicht dazu, die Sitzung nach einer bestimmten Zeit ablaufen zu lassen. Stattdessen wird die Ausführungszeit eines Handlers begrenzt, d. H. Wenn die angegebene Zeit verstrichen ist, wird 503 Service Unavailable
an den HTTP-Client zurückgegeben. Unten ist ein Beispiel für eine solche Nutzung:
func handlerNoTimeout(w http.ResponseWriter, r *http.Request) {
//This handler takes 1 second to finished, won't timeout
time.Sleep(1 * time.Second)
w.Write([]byte("Handler OK"))
}
func handlerTimeout(w http.ResponseWriter, r *http.Request) {
//This handler takes 4 seconds to finished.
//Before finished, it will timeout,
//503 response will be sent to client + given message (i.e. Timeout!)
time.Sleep(4 * time.Second)
w.Write([]byte("Handler timeout (never executed)"))
}
func main() {
mux := http.NewServeMux()
rh := http.RedirectHandler("http://10.130.0.10:820/login", 307)
mux.Handle("/", rh)
mux.HandleFunc("/timeout", handlerTimeout)
mux.HandleFunc("/notimeout", handlerNoTimeout)
tmux := http.TimeoutHandler(mux, time.Second*3, "Timeout!")
go http.ListenAndServe(":818", tmux)
go http.ListenAndServeTLS(":821", "server.pem", "server.key", tmux)
var input string
fmt.Scanln(&input)
fmt.Println("done")
}
Wenn Ihr Zugang /timeout
, werden Sie 503
mit Timeout-Meldung erhalten, aber wenn Sie /notimeout
zuzugreifen, wird die HTTP-Antwort 200 OK
sein.
Eine Sitzung ist ein Zustand von dem Server gespeichert, nicht eine Verarbeitungsschritte/Aufgabe/Job, die kann Zeit beenden muss. Eine Sitzung ist nicht abgelaufen, es sei denn, Sie definieren eine Funktion/Methode/Handler im Hintergrund, beobachten regelmäßig die Zeit für die Sitzungsgenerierung und markieren die abgelaufene Zeit als abgelaufen.
In Ihrem Code wird es Timeout, wenn Redirect-Handler (d. H. Login-Handler) mehr als 3 Sekunden benötigt.
Haben Sie versucht, die Zeitüberschreitung der Elemente zu überprüfen, wenn Sie ListenAndServe nicht in einer Goroutine ausführen? Um den Kommentar aus ListenAndServeTLS zu testen, führen Sie ListenAndServe aus, ohne eine separate Routine zu starten. – reticentroot