这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。
在Gin框架中,我们在处理请求时可以加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件。中间件可以用来处理一些公共的业务逻辑,例如登录验证,耗时记录。
中间件的定义
Go语言的中间件必须是一个gin.HandlerFunc类型。例如下面的代码是一个简单的jwt登录验证的中间件。
func JwtAuth() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.Query("token")
if token == "" {
c.JSON(http.StatusOK, Response{
1,
"未登录或非法访问",
})
log.Info("未登录或非法访问")
c.Abort()
return
}
c.Set("claims", claims)
c.Next()
}
}
中间件的主要函数
c.Abort()
这个函数会直接跳过后面要执行的内容,例如权限认证失败,就不能进行后序操作。
c.Next()
先执行后面的内容,执行过后面的返回执行当前内容。
中间件的注册
中间件注册需要在路由中填写对应的中间件,在其他业务处理时就会先调用中间件业务。
为全局路由注册
func main() {
r.Static("/static", "./public")
r.Use(middleware.JwtAuth())
r.GET("/douyin", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello world!",
})
})
r.Run()
}
为单个路由注册
apiRouter.POST("/comment/action/", middleware.JwtAuth(), controller.CommentAction)
为路由组注册
relation := apiRouter.Group("/relation")
{
relation.Use(middleware.JwtAuth())
relation.POST("/action/", controller.RelationAction)
relation.GET("/follow/list/", controller.FollowList)
relation.GET("/follower/list/", controller.FollowerList)
relation.GET("/friend/list/", controller.FriendList)
}
中间件注意事项
gin.Default()默认使用了Logger和Recovery中间件,其中:
Logger中间件将日志写入gin.DefaultWriter。
Recovery中间件会recover任何panic。如果有panic的话,会写入500响应码。
如果不想使用上面两个默认的中间件,可以使用gin.New()新建一个没有任何默认中间件的路由。
一般情况使用默认的即可。