是否可以使用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