在实际的业务开发的时候,我们经常会涉及到这样的场景:
业务中除了登录接口之外,请求其他的接口都需要判断下用户是否登录。
在java web里面像这种我们一般使用的是filter来实现拦截判断,在go语言里面,主要是使用中间件的形式来实现的。所以这里的话我们来演示一下Gin web框架的中间件,实现判断用户是否登录。示例代码如下:
// demo1 project main.go package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.GET("/getUinfo/:uid", authFilter(), getUinfo) router.Run(":9000") } func authFilter() gin.HandlerFunc { return func(c *gin.Context) { token := c.Request.Header.Get("token") //如果有登录,并且验证成功则继续往下执行 if token == "123456" { c.Next() return } //否则返回错误信息,并且不往下执行 c.JSON(http.StatusOK, gin.H{ "code": 401, "message": "未登录", }) c.Abort() return } } /** *接口实现方法 */ func getUinfo(c *gin.Context) { c.JSON(200, gin.H{ "code": 200, "message": "请求成功", "uid": c.Param("uid"), "uname": "张三", }) }
这个demo比较简单,主要是使用gin.HandlerFunc编写一个filter,然后在创建接口路由的时候把代码filter传递进去。
此时的话,Gin的中间件就生效了,在访问的时候,我们会首先执行中间件,然后根据中间件的逻辑判断进行相关的返回,这里我们运行一下:
可以看到这里的中间件是生效的,已经对未登录的用户做了过滤判断。
备注:
1、gin的中间件的话,返回类型必须要是gin.HandlerFunc。 2、如果出现了判断不通过的场景,记得要使用abort然后再return。 3、每一个声明的路由如果需要使用中间件,都需要在创建路由的时候把这个中间件传递进去。 4、如果中间件是全局的,也可以不需要写到每一个接口里面去,直接使用router.use(xxx)即可
还没有评论,来说两句吧...