Gin中Next和Abort的理解:(挂起和终止运行)

背景:

       在项目开发中,我们会遇到一些需求,比如开发中我们可能在服务器与客户端交互的时候,通过中间件验证客户的合法性,如果合法则正常执行相关的操作,但是不合法的话,我们需要终止本次的请求。那么针对这个需求

我们采用GO语言中的Web框架Gin进行简单的说明。

首先Gin实现上面的功能就是通过Next和Abort这两个函数。

next()顾名思义就是挂起继续向下走,然后执行完成下面的函数,会反过来最后执行该中间件

abort()顾名思义就是终止的意思,也就是说执行该函数,会终止后面所有的该请求下的函数。

简单理解next表示挂起,当处理完所有的中间件函数(包括本次请求)的时候才会停止,执行完一次完整的请求。

参考文件: https://blog.csdn.net/big_kevin/article/details/109025888

Abort表示终止,也就是说,执行Abort的时候会停止所有的后面的中间件函数的调用。

参考文件:  https://blog.csdn.net/u010918487/article/details/82997792

下面是我自己写的相关测试,里面涉及到中间件认证数据,判断是否要终止后面请求:

func main() {
	r := gin.Default()

	// 路由组使用 gin.BasicAuth() 中间件
	// gin.Accounts 是 map[string]string 的一种快捷方式
	authorized := r.Group("/admin").Use(func(c *gin.Context) {
		//设计一种简单的中间件进行判断客户端传输的数据是否有效
		if d == "play" {

			c.JSON(http.StatusOK, gin.H{
				"msg": "成功进入相关的业务",
			})
			c.Next()
		} else {
			c.JSON(http.StatusOK, gin.H{
				"code": 403,
				"msg":  "对不起,您没有该接口访问权限,请联系管理员",
			})
			fmt.Println("结束权限访问功能")
			c.Abort() //终止下面的函数执行
		}
	})
	// /admin/secrets 端点
	// 触发 "localhost:8080/admin/secrets
	authorized.GET("/secrets", func(c *gin.Context) {
		// 获取用户,它是由 BasicAuth 中间件设置的
		c.JSON(http.StatusOK, gin.H{"user": "gcg", "secret": "123456"})
	})
	// 监听并在 0.0.0.0:8080 上启动服务
	r.Run(":8080")
}

代码很清晰,那就是,如果请求参数中的play值正确则成功进入相关业务,同时,因为是C.Next()所以后面会继续的执行/secrets里面的业务

相反如果验证play值无效,会直接执行code: 403.同时因为是C.Abort()所以后面会停止执行/secrets里面的业务

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Golang Gin 框架提供了 `Abort` 方法和 `return` 语句来终止请求的处理过程,它们的区别如下: - `Abort` 方法会终止当前请求的处理过程,并不再执行后续的处理函数;而 `return` 语句只会终止当前处理函数的执行,但不会终止整个请求的处理过程,后续的处理函数仍然会被执行。 - `Abort` 方法会将请求的处理结果立即返回给客户端,不再执行后续的处理函数;而 `return` 语句只是直接返回了处理函数的返回值,后续的处理函数仍然会被执行,直到请求处理完毕才将结果返回给客户端。 在实际开发,我们通常使用 `Abort` 方法来终止请求的处理过程,因为它可以立即返回结果给客户端,避免了不必要的处理,提高了性能。 下面是一个使用 `Abort` 方法的例子: ```go func TokenAuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { token := c.Request.Header.Get("Authorization") if token == "" { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Authorization token not found"}) return } // 验证 token 是否有效,这里假设有效 c.Next() } } ``` 在上面的代码,当请求头的 Authorization 字段为空时,我们使用 `AbortWithStatusJSON` 方法终止请求处理过程,并返回 401 错误给客户端。 需要注意的是,当使用 `Abort` 方法时,我们需要确保已经向客户端返回了结果,否则客户端可能会一直等待,产生超时等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值