Gorilla Simple Handler Filter 實現

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

今晚簡單擼了一個,感覺蠻簡潔實用,可以 share 出來

mux_filter.go

123456789101112131415161718192021222324252627282930313233343536373839
package utilsimport (    "net/http"    "github.com/gorilla/mux")var router *mux.Routertype HttpFunc func(w http.ResponseWriter, r *http.Request) booltype RouteFilter struct {    filters []HttpFunc    hdlr    http.HandlerFunc}func NewRouteFilter() *RouteFilter {    return &RouteFilter{}}func (f *RouteFilter) AddFilter(h HttpFunc) *RouteFilter {    f.filters = append(f.filters, h)    return f}func (f *RouteFilter) Handler(h http.HandlerFunc) *RouteFilter {    f.hdlr = h    return f}func (f *RouteFilter) ServeHTTP(w http.ResponseWriter, req *http.Request) {    for _, hdlr := range f.filters {        if !hdlr(w, req) {            return        }    }    f.hdlr(w, req)}

使用方法 (實現一個 Basic Auth 的 Filter):

utils.go

12345678910111213141516171819202122232425262728293031
package commonimport ("net/http""strings")type AuthFunc func(string, string) boolfunc AuthFilterWrapper(authFunc AuthFunc) func(w http.ResponseWriter, r *http.Request) bool {return func(w http.ResponseWriter, r *http.Request) bool {_, ok := r.Header["Authorization"]if !ok {http.Error(w, "Need Authorization Header", http.StatusBadRequest)return false}auth := strings.SplitN(r.Header["Authorization"][0], " ", 2)if len(auth) != 2 {http.Error(w, "Bad Syntax", http.StatusBadRequest)return false}if !authFunc(auth[0], auth[1]) {http.Error(w, "Authorization Failed", http.StatusUnauthorized)return false}return true}}

app.go

1234567891011121314151617181920212223242526
func UserAuth(method, payload string) bool {    switch method {    case "Basic":        p, _ := base64.StdEncoding.DecodeString(payload)        pair := strings.SplitN(string(p), ":", 2)        if len(pair) != 2 {            return false        }        return true    case "Token":        return true    }    return false}func InitHandlers(r *mux.Router) {    s := r.PathPrefix(URL_PREFIX).Subrouter()    s.Handle("/test", utils.NewRouteFilter().        AddFilter(common.AuthFilterWrapper(UserAuth)).        Handler(testHandler))}func testHandler(w http.ResponseWriter, r *http.Request) {    w.Write([]byte("OK"))}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.