在 gin中,通过默认的函数,构建一个实现了带默认中间件的 *Engine。

r := gin.Default()

默认绑定了Logger和Recovery中间件,帮助我们进行日志输出和错误处理。

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

func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {
engine.RouterGroup.Use(middleware...)
engine.rebuild404Handlers()
engine.rebuild405Handlers()
return engine
}

func (group *RouterGroup) POST(relativePath string, handlers ...HandlerFunc) IRoutes {
return group.handle(http.MethodPost, relativePath, handlers)
}

func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
return group.handle(http.MethodGet, relativePath, handlers)
}

可以看到,gin的中间件是通过 User()方法进行设置,他接收一个 HandlerFunc类型的可变参数;HandlerFunc在Gin中是很常见的一个类型。

中间件实现BasicAuth

在gin中,默认提供了 gin.BasicAuth 中间件,来实现基本的认证功能

//针对全局路由的BasicAuth
func main() {
router := gin.Default()
router.Use(gin.BasicAuth(gin.Accounts{
"dba" : "dbapass",
}))
router.GET("/users", func(c *gin.Context) {
c.JSON(200, true)
})
router.Run(":8080")
}

//针对路由组的BasicAuth

func main() {
   router := gin.Default()
v1RouterGroup := router.Group("/v1")
v1RouterGroup.Use(gin.BasicAuth(gin.Accounts{
"dba" : "dbapass",
}))
{
v1RouterGroup.GET("/users", func(c *gin.Context) {
c.JSON(200, true) //true
})
}
router.Run(":8080")
}

// 针对特定路由的BasicAuth
func main() {
router := gin.Default()
v1RouterGroup := router.Group("/v1")
{
v1RouterGroup.GET("/users", gin.BasicAuth(gin.Accounts{
"dba" : "dbapass",
}), func(c *gin.Context) {
c.JSON(200, true) //true
})
}
router.Run(":8080")
}
 

  

自定义中间件

gin的中间件就是一个 HandlerFunc,那么只要自己实现一个 HandlerFunc 就能实现一个中间件

func costTime() gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
c.Next()
costTime := time.Since(start)
url := c.Request.URL.String()
logger.Debug("url %s exec cost %d", url, costTime)
}
}

gin中的 Next() 和 Abrot()

// Next should be used only inside middleware.
// It executes the pending handlers in the chain inside the calling handler.
// See example in GitHub.
// 在执行的 handler 中执行HandlerFunc链中挂起的 handler
func (c *Context) Next() {
c.index++
for c.index < int8(len(c.handlers)) {
c.handlers[c.index](c)
c.index++
}
}

// Abort prevents pending handlers from being called. Note that this will not stop the current handler.
// Let's say you have an authorization middleware that validates that the current request is authorized.
// If the authorization fails (ex: the password does not match), call Abort to ensure the remaining handlers
// for this request are not called.
// Abort 在被调用的函数中阻止挂起函数。注意这将不会停止当前的函数。例如,你有一个验证当前的请求是否是认证过的 Authorization 中间件。
// 如果验证失败(例如,密码不匹配),调用 Abort 以确保这个请求的其他函数不会被调用。
func (c *Context) Abort() {
c.index = abortIndex
}

gin框架使用【7.中间件使用】的更多相关文章

  1. 基于gin框架和jwt-go中间件实现小程序用户登陆和token验证

    本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...

  2. gin框架中的中间件

    全局中间件 所有请求都经过此中间件 中间件中设置值 func MiddleWare() gin.HandlerFunc { return func(context *gin.Context) { t ...

  3. Gin框架系列03:换个姿势理解中间件

    什么是中间件 中间件,英译middleware,顾名思义,放在中间的物件,那么放在谁中间呢?本来,客户端可以直接请求到服务端接口. 现在,中间件横插一脚,它能在请求到达接口之前拦截请求,做一些特殊处理 ...

  4. gin框架中间件

    1. Gin框架中间件Gin框架中间件A. Gin框架允许在请求处理过程中,加入用户自己的钩子函数.这个钩子函数就叫中间件B. 因此,可以使用中间件处理一些公共业务逻辑,比如耗时统计,日志打印,登陆校 ...

  5. gin框架中中间件的编写与使用

    概念 一个完整的系统可能包括鉴权认证.权限管理.安全检查.日志记录等多维度的系统支持. 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加 ...

  6. 02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)

    数据解析和绑定 json数据解析和绑定 package main import ( "github.com/gin-gonic/gin" "net/http" ...

  7. gin框架使用注意事项

    gin框架使用注意事项 本文就说下这段时间我在使用gin框架过程中遇到的问题和要注意的事情. 错误处理请求返回要使用c.Abort,不要只是return 当在controller中进行错误处理的时候, ...

  8. Gin框架源码解析

    Gin框架源码解析 Gin框架是golang的一个常用的web框架,最近一个项目中需要使用到它,所以对这个框架进行了学习.gin包非常短小精悍,不过主要包含的路由,中间件,日志都有了.我们可以追着代码 ...

  9. gin框架学习手册

    前言 gin框架是go语言的一个框架,框架的github地址是:https://github.com/gin-gonic/gin 转载本文,请标注原文地址:https://www.cnblogs.co ...

  10. go的gin框架从请求中获取参数的方法

    前言: go语言的gin框架go里面比较好的一个web框架, github的start数超过了18000.可见此框架的可信度 如何获取请求中的参数 假如有这么一个请求: POST   /post/te ...

随机推荐

  1. 嵌入式Linux应用开发完全手册之环境搭建

    @ 目录 0.下载源配置 1.电脑BIOS启动虚拟化 2.linux网卡查看与IP设置 3.windows NAT虚拟网络配置 4.修改 Ubuntu 的 mountd 端口 5.vim设置 6.Mo ...

  2. [SPDK/NVMe存储技术分析]010 - 理解SGL

    在NVMe over PCIe中,I/O命令支持SGL(Scatter Gather List 分散聚合表)和PRP(Physical Region Page 物理(内存)区域页), 而管理命令只支持 ...

  3. Spring Cloud Alibaba分布式事务组件 seata 详解(小白都能看懂)

    一,什么是事务(本地事务)? 指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 简单的说,事务就是并发控制的单位,是用户定义的一个操作序列.      而一个逻辑工作单元要成 ...

  4. idea使用技巧、心得1

    0.安装idea之后的准备 (1) 永久快乐使用:在我的博客搜索安装idea关键词既可 (2) 取消更新: (3) idea 官网的关于idea的使用手册:https://www.jetbrains. ...

  5. 什么是 FutureTask?使用 ExecutorService 启动任务?

    在 Java 并发程序中 FutureTask 表示一个可以取消的异步运算.它有启动和取消 运算.查询运算是否完成和取回运算结果等方法.只有当运算完成的时候结果才 能取回,如果运算尚未完成 get 方 ...

  6. xml文件使用DOM解析,报异常org.xml.sax.SAXParseException,"characterEncoding" 的引用必须以 ';' 分隔符结尾异常

    这个异常一般为xml文件对&的报错,只需要将&改为转义后的&amp即可解决

  7. try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?

    答:会执行,在方法返回调用者前执行.

  8. 什么是 AQS ?

    AQS 是 AbustactQueuedSynchronizer 的简称,它是一个 Java 提高的底层同步工具类,用一个 int 类型的变量表示同步状态,并提供了一系列的 CAS 操作来管理这个同步 ...

  9. java使用正则表达式在文档里找匹配

    public static void main(String[] args) { String str = "123我是456张三789的学生"; String regex2 = ...

  10. memcached 与 redis 的区别?

    1.Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储.而 memcache 只支持简单数据类型,需要客户端自己处理复 杂对象 2.R ...