中间件的作用
中间件的作用在于,可以对于多个不同的请求,都应用某些同样的代码,做到可以复用代码的用途。例如,登陆、日志等等。
gin的中间件
gin的中间件,在gin里面是一个HandlerFunc,实际上跟路由的处理函数是一样的,一个中间件,即是一个带 *gin.Context
参数的函数。
gin中间件可以处理在路由函数前,也可以处理在路由函数后的事务。主要根据c.Next()
在中间件中的调用位置来决定。灵活度很高。
gin的代码实现
读gin的代码(v1.6.3)在run之后,进入到Engine的handleHTTPReqquest
之后,就调用c.Next()
,包括了正式的处理路由业务的方法,也是从这个 c.Next() 调用,开始执行。
Next的代码
func (c *Context) Next() {
c.index++
for c.index < int8(len(c.handlers)) {
c.handlers[c.index](c)
c.index++
}
}
Next会依序执行路由的各个Handler(包括中间件、路由业务方法)。c.index
则是当前执行到的Handler标识,而且就是根据这个index,可以保证不会重复执行,并且在中间件里面调用Next之后,会进入到下一个handler,而在执行完之后,又可以依次回到调用的地方。进行后置的处理。
同时,即使在中间件或者路由业务方法里面不调用Next, 亦可以进行到下一个handler的执行。