废话不多说直接上干货。。。。
1、定义中间件嵌套函数类型
type HttpHandlerDecorator func(http.Handler) http.Handler
2、实现中间件嵌套函数
func MidHandler(h http.Handler, decors ...HttpHandlerDecorator) http.Handler {
for i:=len(decors) -1; i>=0; i-- {
deco := decors[i]
h = deco(h)
}
return h
}
3、实现自定义中间件(校验签名)
func CheckSignature(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var signString string
var hmacObj hash.Hash
uri := r.URL.Path[1: len(r.URL.Path)]
signatureList := r.Header["sign"]
if len(signatureList) != 1 {
//r.Header["localCheckResult"] = []string{"Please input sign parameter."}
goto END
}
signString = fmt.Sprintf("%s&%s&%s", r.Method, uri, akskList[0])
hmacObj = hmac.New(sha1.New, []byte(akskList[1]))
hmacObj.Write([]byte(signString))
if signatureList[0] != hex.EncodeToString(hmacObj.Sum(nil)) {
//r.Header["localCheckResult"] = []string{"Check sign failed, please input right sign."}
goto END
}
END:
h.ServeHTTP(w, r)
})
}
4、http 路由注册是调用中间件
http.Handle("/record", middleware.MidHandler(lib.PackHandler(&controllers.RecordHandler{}), middleware.CheckSignature))