为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
BIG阳 2021-09-13 10:10:09
是否可以使用 net/http 包和/或任何 gorilla 库在进入处理程序之前在每个 URL 上执行一些代码?例如,检查连接是否来自列入黑名单的 IP 地址?
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

创建一个处理程序,在检查 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 和其他路由器。


查看完整回答
反对 回复 2021-09-13
?
函数式编程

TA贡献1807条经验 获得超9个赞

如果您想使用我发现很常见的默认多路复用器,您可以像这样创建中间件:


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)


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信