2 回答

TA貢獻1829條經(jīng)驗 獲得超13個贊
創(chuàng)建一個處理程序,在檢查 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、Gorilla mux 和其他路由器。

TA貢獻1807條經(jīng)驗 獲得超9個贊
如果您想使用我發(fā)現(xiàn)很常見的默認多路復用器,您可以像這樣創(chuàng)建中間件:
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)
- 2 回答
- 0 關注
- 174 瀏覽
添加回答
舉報