也加了如果有认证时的执行流程:
一个错误,
一个正确。
package main import ( "fmt" "log" "net/http" //"time" ) func middlewareFirst(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println("MiddlewareFirst - Before Handler") next.ServeHTTP(w, r) log.Println("MiddlewareFirst - After Handler") }) } func middlewareSecond(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println("MiddlewareSecond - Before Handler") if r.URL.Path == "/message" { if r.URL.Query().Get("password") == "password" { log.Println("Authorized to the system") next.ServeHTTP(w, r) } else { log.Println("Failed to authorize to the system") return } } else { next.ServeHTTP(w, r) } log.Println("MiddlewareSecond - After Handler") }) } func index(w http.ResponseWriter, r *http.Request) { log.Println("Executing index handler") fmt.Fprintf(w, "welcome!") } func message(w http.ResponseWriter, r *http.Request) { log.Println("Executing message handler") fmt.Fprintf(w, "HTTP Middleware is awesome!") } func iconHandler(w http.ResponseWriter, r *http.Request) { } func main() { http.HandleFunc("/favicon.ico", iconHandler) http.Handle("/", middlewareFirst(middlewareSecond(http.HandlerFunc(index)))) http.Handle("/message", middlewareFirst(middlewareSecond(http.HandlerFunc(message)))) server := &http.Server{ Addr: ":8080", } log.Println("Listening...") server.ListenAndServe() }