背景:

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

我们采用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里面的业务

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐