Gin 框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函 数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、 记录日志、耗时统计等。
c.Next()可以在路由匹配完成后执行一些操作 ps. c.Abort() 表示终止调用该请求的剩余处理程序
package routers
import (
"fmt"
"time"
"github.com/gin-gonic/gin"
)
func initMiddleware(c *gin.Context) {
start := time.Now().UnixNano()
fmt.Println("i'm middle")
c.Next()
end := time.Now().UnixNano()
fmt.Println(end - start)
}
func DefaultRoutersInit(r *gin.Engine) {
defaultRouters := r.Group("/")
{
defaultRouters.GET("/", initMiddleware, func(c *gin.Context) {
c.String(200, "right")
time.Sleep(time.Second)
})
defaultRouters.GET("/news", initMiddleware, func(c *gin.Context) {
c.String(200, "新闻")
})
}
}
package middlewares
import (
"fmt"
"time"
"github.com/gin-gonic/gin"
)
func InitMiddleware(c *gin.Context) {
fmt.Println(time.Now())
fmt.Println(c.Request.URL)
c.Set("username", "123")
}
func (con ArticleController) Add(c *gin.Context) {
username, _ := c.Get("username")
//类型断言
v, ok := username.(string)
if ok == true {
c.String(200, "文章列表-add"+v)
} else {
c.String(200, "文章列表-获取失败")
}
fmt.Println(username)
}
中间件注意事项 gin 默认中间件 gin.Default()默认使用了 Logger 和 Recovery 中间件,其中: • Logger 中间件将日志写入 gin.DefaultWriter,即使配置了GIN_MODE=release。 • Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500 响应码。 如果不想使用上面两个默认的中间件,可以使用 gin.New()新建一个没有任何默认中间件的路由。 gin中间件中使用 goroutine 当在中间件或 handler 中启动新的 goroutine 时,不能使用原始的上下文(c *gin.Context), 必须使用其只读副本(c.Copy())
func InitMiddleware(c *gin.Context) {
fmt.Println(time.Now())
fmt.Println(c.Request.URL)
c.Set("username", "123")
cCp := c.Copy()
go func() {
time.Sleep(2 * time.Second)
fmt.Println(cCp.Request.URL.Path)
}()
}