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