Golang net/http和Gorilla:在处理程序之前运行代码

Golang net/http和Gorilla:在处理程序之前运行代码,go,gorilla,Go,Gorilla,在进入处理程序之前,是否可以使用net/http包和/或任何gorilla库在每个URL上执行一些代码?例如,要检查连接是否来自黑名单中的IP地址?请创建一个处理程序,在检查IP地址后调用另一个处理程序: type checker struct { h http.Handler } func (c checker) ServeHTTP(w http.ResponseWriter, r *http.Request) { if blackListed(r.RemoteAddr) {

在进入处理程序之前,是否可以使用net/http包和/或任何gorilla库在每个URL上执行一些代码?例如,要检查连接是否来自黑名单中的IP地址?

请创建一个处理程序,在检查IP地址后调用另一个处理程序:

type checker struct {
   h http.Handler
}

func (c checker) ServeHTTP(w http.ResponseWriter, r *http.Request) {
   if blackListed(r.RemoteAddr) {
      http.Error(w, "not authorized", http.StatusForbidden)
      return
   }
   c.h.ServeHTTP(w, r)
}
将此处理程序传递给ListendService,而不是原始处理程序。例如,如果您有:

err := http.ListenAndServe(addr, mux)
将代码更改为

err := http.ListenAndServe(addr, checker{mux})

这也适用于ListendServe的所有变体。它与http.ServeMux、Gorilla mux和其他路由器配合使用。

创建一个处理程序,在检查IP地址后调用另一个处理程序:

type checker struct {
   h http.Handler
}

func (c checker) ServeHTTP(w http.ResponseWriter, r *http.Request) {
   if blackListed(r.RemoteAddr) {
      http.Error(w, "not authorized", http.StatusForbidden)
      return
   }
   c.h.ServeHTTP(w, r)
}
将此处理程序传递给ListendService,而不是原始处理程序。例如,如果您有:

err := http.ListenAndServe(addr, mux)
将代码更改为

err := http.ListenAndServe(addr, checker{mux})

这也适用于ListendServe的所有变体。它可以与http.ServeMux、Gorilla mux和其他路由器一起使用。

如果您想使用默认的muxer,我发现它很常见,您可以创建如下中间件:

func mustBeLoggedIn(handler func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        // Am i logged in?
        if ...not logged in... {
            http.Error(w, err.Error(), http.StatusUnauthorized)
            return
        }
        // Pass through to the original handler.
        handler(w, r)
    }
}
像这样使用它:

http.HandleFunc("/some/priveliged/action", mustBeLoggedIn(myVanillaHandler))
http.ListenAndServe(":80", nil)

如果您想使用默认的muxer(我发现这很常见),您可以创建如下中间件:

func mustBeLoggedIn(handler func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        // Am i logged in?
        if ...not logged in... {
            http.Error(w, err.Error(), http.StatusUnauthorized)
            return
        }
        // Pass through to the original handler.
        handler(w, r)
    }
}
像这样使用它:

http.HandleFunc("/some/priveliged/action", mustBeLoggedIn(myVanillaHandler))
http.ListenAndServe(":80", nil)

在此上下文中,您需要的称为中间件,另请参阅在此上下文中您需要的称为中间件,另请参阅