Gin(七):中间件的使用和定义

youngxhui · · 1109 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

文章首发于 ISLAND

中间件 middlewaregolang 中是一个很重要的概念,与 java 中拦截器很相似。通过 gin 源代码来看看中间件代码使用。

????中间件使用

我们还是回到了 initRouterSetupRouter 这个方法。

router := gin.Default()
复制代码

我们的项目是从这一行代码开始的,所以我们看看这一行代码做了些什么。打开 Default 源码,

func Default() *Engine {
	debugPrintWARNINGDefault()
	engine := New()
	engine.Use(Logger(), Recovery())
	return engine
}
复制代码

源码中,首先是 New 了一个 engine ,紧接着通过 Use 方法,传入了 Logger()Recovery() ,而 LoggerRecovery 就是两个中间件。

其中 Logger 是对日志进行记录,而 Recovery 是对有 painc时, 进行 500 的错误处理

查看了源码之后,那么我们也就知道如何使用中间件了。

????自定义一个中间件

中间件需要返回 gin.HandlerFunc 函数,所以定义返回函数。

而且 中间件有个 Next 函数,在我们定义的众多中间件,会形成一条中间件链,而通过 Next 函数来对后面的中间件进行执行。Next 函数是在请求前执行,而 Next 函数后是在请求后执行。

我们来自己定义一个 Logger 日志,新建一个 middleware 文件夹,里面新建 Logger.go,进行我们自定义的日志展示。

package middleware

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"time"
)

func Logger() gin.HandlerFunc {
	return func(context *gin.Context) {
		host := context.Request.Host
		url := context.Request.URL
		method := context.Request.Method
		fmt.Printf("%s::%s \t %s \t %s ", time.Now().Format("2006-01-02 15:04:05"), host, url, method)
		context.Next()
		fmt.Println(context.Writer.Status())
	}
}
复制代码

全局中间件

修改 initRouter 中的 SetupRouter 方法,将我们自定义的中间件进行添加。

router := gin.New()
// 添加自定义的 logger 中间件
router.Use(middleware.Logger(), gin.Recovery())
复制代码

此时重新启动我们的项目,访问localhost:8080端口,控制台上就会打印出我们新的格式日志。

2019-07-23 18:17:58::localhost:8080 / GET 200

当然,此时此刻的 Logger 中间件是全局使用,我们也可以给特定的路由进行使用。

局部中间件

比如我们规定某些路由需要登录后才能访问,那么我们可以给这些路由进行授权管理。

我们重新写一个 Auth 中间件来进行管理,这里不具体实现该中间件,后期会实现,这里只进行展示。

package middleware

import "github.com/gin-gonic/gin"

func Auth() gin.HandlerFunc {
	return func(context *gin.Context) {
		println("已经授权")
		context.Next()
	}
}
复制代码

我们在 用户信息修改和用户信息展示的路由上进行该中间件的添加。

userRouter.GET("/profile/", middleware.Auth(), handler.UserProfile)
userRouter.POST("/update", middleware.Auth(), handler.UpdateUserProfile)
复制代码

再次运行项目,当我们对用户详情页进行访问的时候,控制台上会打印出 已经授权 的日志,而访问其他页面则不会出现,说明我们的中间件使用成功。

✍总结

通过本次的中间件了解,基本掌握了中间件如何编写和使用,对于全局和局部的两种中间件也有着不同的使用方法和使用范围。

????‍????本章节代码

Github

????历史文章

Gin(一):Hello
Gin(二):路由Router
Gin(三):模板tmpl
Gin(四):表单提交校验和模型绑定
Gin(五):连接MySQL
Gin(六):文件的上传
Gin(七):中间件的使用和定义 Gin(八):Cookie的使用

个人公众号

最近刚刚申请了一个公众号,以后文章会同步发送,欢迎各位大佬关注


有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:youngxhui

查看原文:Gin(七):中间件的使用和定义

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1109 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传