go fiber:全局中间件添加排除的path
一,代码:
全局中间件对所有的api生效,
如果有个别不想应用全局中间件的api,
则需要从代码中进行排除:例如:支付宝或微信的回调接口
package middleware
import (
"fmt"
"github.com/gofiber/fiber/v2"
"regexp"
)
func ApiSign(c *fiber.Ctx) error {
//得到当前url
uri := c.Request().URI() //最完整的路径,形如:http://192.168.219.6:3000/user/info?name=111
fmt.Println(uri)
fullURL := c.OriginalURL() //包含参数,但没有host,形如:/user/info?name=111
fmt.Println(fullURL)
path:=c.Path() //不包含参数,也没有host,形如:/user/info
fmt.Println(path)
if path=="/favicon.ico" {
return c.SendString("文件不存在,file not exist")
}
//以*排除
exclude := regexp.MustCompile("/user/*")
if exclude != nil && exclude.MatchString(path) {
fmt.Println(path+" 被排除,不需要验证签名")
return c.Next()
}
//列举出要排除的路径
excludeMap := map[string]int{
"/article/add": 1,
"/article/list": 1,
}
if _, ok := excludeMap[path]; ok {
fmt.Println(path+" 被排除,不需要验证签名")
return c.Next()
} else {
fmt.Println(path+" 未被排除,需要验证签名")
//验证签名的逻辑
}
fmt.Println("middle1 before")
err:=c.Next()
fmt.Println("middle1 after")
return err
}
分别用了两种方式检测是否要排除
二,测试效果:
http://192.168.219.6:3000/article/info?name=111
/article/info?name=111
/article/info
/article/info 未被排除,需要验证签名
middle1 before
middle1 after
http://192.168.219.6:3000/article/list?name=111
/article/list?name=111
/article/list
/article/list 被排除,不需要验证
middle1 before
Query Params: map[name:111]