Golang网/ http和大猩猩:处理程序之前运行代码(Golang net/http and G

2019-10-21 15:27发布

是否可以使用net / HTTP包和/或任何大猩猩库做一些代码才去处理程序上的每一个URL,执行? 例如,要检查如果连接是从列入黑名单的IP地址来了吗?

Answer 1:

创建检查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)
}

通过这个处理程序ListenAndServe,而不是原来的处理程序。 例如,如果您有:

err := http.ListenAndServe(addr, mux)

修改代码,

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

这也适用于ListenAndServe的所有变化。 它的工作原理与http.ServeMux,大猩猩MUX和其他路由器。



Answer 2:

如果您想使用默认的流合并,我觉得这是很常见,你可以创建中间件就像这样:

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)


文章来源: Golang net/http and Gorilla: run code before handler
标签: go gorilla