GIN使用中间件1

381 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

中间件作用以及概述

在写项目的时候,我们可能需要有登录认证、权限校验、数据分页、记录日志、耗时统计等功能。这时候我们就需要使用中间件了,就是在匹配路由前后多了一系列操作。

Gin中的中间件必须是一个 gin.HandlerFunc 类型,

配置路由的时候可以传递多个func 回调函数,最后一个 func 回调函数前面触发的方法都可以称为中间件。

package main
import ( 
"fmt"
"github.com/gin-gonic/gin"
)
func initMiddleware(ctx *gin.Context) {
fmt.Println("中间件")
}
func main() {
r := gin.Default()
r.GET("/", initMiddleware, func(ctx *gin.Context) {
ctx.String(200, "首页中间件")
})
r.GET("/news", initMiddleware, func(ctx *gin.Context) {
ctx.String(200, "新闻页面中间件")
})
r.Run(":8080")
}

ctx.Next()调用该请求的剩余处理程序

package main
import ( "fmt"
"time"
"github.com/gin-gonic/gin"
)
func initMiddleware(ctx *gin.Context) {
fmt.Println("1-执行中中间件")
start := time.Now().UnixNano() //执行开始时间
// 调用该请求的剩余处理程序
ctx.Next()  //进行下一个程序块
fmt.Println("3-程序执行完成 计算时间")
// 计算耗时 Go 语言中的 Since()函数保留时间值,并用于评估与实际时间的差异
end := time.Now().UnixNano()  //程序结束时间
fmt.Println(end - start)
}
func main() {
r := gin.Default()
r.GET("/", initMiddleware, func(ctx *gin.Context) {
fmt.Println("2-执行首页返回数据")
ctx.String(200, "首页--中间件演示")
})
r.GET("/news", initMiddleware, func(ctx *gin.Context) {
ctx.String(200, "新闻页面--中间件演示")
})
r.Run(":8080")
}

c.Abort() :终止调用该请求的剩余处理程序(可以用来做拦截器)

package main
import ( "fmt"
"github.com/gin-gonic/gin"
)
func initMiddlewareOne(ctx *gin.Context) {
fmt.Println("initMiddlewareOne--1-执行中中间件")
// 调用该请求的剩余处理程序
ctx.Next()
fmt.Println("initMiddlewareOne--2-执行中中间件")
}
func initMiddlewareTwo(ctx *gin.Context) {
fmt.Println("initMiddlewareTwo--1-执行中中间件")
// 终止调用该请求的剩余处理程序
ctx.Abort()
fmt.Println("initMiddlewareTwo--2-执行中中间件")
}
func main() {
r := gin.Default()
r.GET("/", initMiddlewareOne, initMiddlewareTwo, func(ctx *gin.Context) {
fmt.Println("执行路由里面的程序")
ctx.String(200, "首页--中间件演示")
})
r.Run(":8080")
}

在执行第二个中间件 ctx.Abort()之后,就相当于终止了下一个程序处理,也就是不执行后面这个路由方法,直接执行第一个中间件的ctx.Next()后面的程序