Gin中间件

内置中间件

  • func BasicAuth(accounts Accounts) HandlerFunc
  • func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc realm:认证分组
  • func Bind(val interface{}) HandlerFunc //拦截请求参数并进行绑定
  • func ErrorLogger() HandlerFunc //错误日志处理
  • func ErrorLoggerT(typ ErrorType) HandlerFunc //自定义类型的错误日志处理
  • func Logger() HandlerFunc //日志记录
  • func LoggerWithConfig(conf LoggerConfig) HandlerFunc
  • func LoggerWithFormatter(f LogFormatter) HandlerFunc
  • func LoggerWithWriter(out io.Writer, notlogged …string) HandlerFunc
  • func Recovery() HandlerFunc
  • func RecoveryWithWriter(out io.Writer) HandlerFunc
  • func WrapF(f http.HandlerFunc) HandlerFunc //将http.HandlerFunc包装成中间件
  • func WrapH(h http.Handler) HandlerFunc //将http.Handler包装成中间件

二种方式创建中间件

// 传递参数
func MiddleWare(ctx (gin.*Content){
fmt.Println("middleware one way")
}

// 不带参数
func MiddleWare()gin.HandlerFunc {
return func(context *gin.Context) {
fmt.Println("middleware two way")
}
}

Gin中间件方法

Next

C.next()会先调用后面中间件的方法,直到没有,倒回去执行

在我们定义的众多中间件,会形成一条中间件链,而通过 Next 函数来对后面的中间件进行执行
特点:

  1. 当遇到c.Next()函数时 它取出所有的没被执行过的注册的函数都执⾏⼀遍,然后再回到本函数中,有点类似递归函数

  2. Next 函数是在请求前执行,而 Next 函数后是在请求后执行。

  3. 可以用在token校验,把用户id存起来供给功能性函数使用

About

终止中间件链条

  1. ctx.Abort()方法的作用 终止调用整个链条
  2. 比如:token认证没有通过,不能直接使用return返回,而是使用Abort来终止

中间件(全局、局部)

路由组使用

v1 := router.Group("/v1")
v1.Use(GroupRouterMiddle())

{
v1.Get...
}

全局使用

绑定在根router上即可

router := gin.Default()

//使用自定义的全局中间件
router.Use(GlobalMiddle)

局部使用

 func Middle1Ware() gin.HandlerFunc{
return func(c *gin.Context) {
t := time.Now()
fmt.Println("我是自定义中间件第2种定义方式---请求之前")
//在gin上下文中定义一个变量
c.Set("example", "CustomRouterMiddle2")
//请求之前
c.Next()
fmt.Println("我是自定义中间件第2种定义方式---请求之后")
//请求之后
//计算整个请求过程耗时
t2 := time.Since(t)
fmt.Println(t2)
}
}

// 路由映射时可以传多个HandlerFunc
router := gin.Default()

router.GET("/hello",Middle1Ware(),Hello)

BasicAuth中间件

// 局部使用中间价
chap05.GET("/basic",gin.BasicAuth(gin.Accounts{
"zs":"123456",
"ls":"123",
"ww":"1234",
}),BasicAuthTest)


// 私有数据
var map_data map[string]interface{} = map[string]interface{}{
"zs":gin.H{"age":18,"addr":"zs-xx"},
"ls":gin.H{"age":19,"addr":"ls-xx"},
"ww":gin.H{"age":20,"addr":"ww-xx"},
}


// 获取私有数据。如果没有权限则获取不到
func BasicAuthTest(ctx *gin.Context) {

user_name := ctx.Query("user_name")

data ,ok := map_data[user_name]

if ok{
ctx.JSON(http.StatusOK,gin.H{"user_name":user_name,"data":data})
}else {
ctx.JSON(http.StatusOK,gin.H{"user_name":user_name,"data":"没有权限"})
}
}