一,程式碼:
全域性中介軟體對所有的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]