如何检查所有请求的用户代理?

问题描述 投票:0回答:2

我有一个定义 user_agent 的函数:

func getUserAgent(c *gin.Context) bool {
    ua := ua.Parse(c.Request.UserAgent())
    if ua.Bot {
        return false
    } else {
        return true
    }
}

另外,我有路线,我需要在每个路线中调用 getUserAgent ,如果为真 - 使用我的路线,如果为假 - 返回其他内容。我该怎么做?

路线:

func Routes(router *gin.Engine) {

    router.GET("/user_agent", getUserAgent)

    router.GET("/", func(c *gin.Context) {

        c.HTML(http.StatusOK, "index.html", nil)
    })
    router.GET("/:some_urls", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.html", nil)
    })

    categories := router.Group("/categories")
    {
        categories.GET("/", controller.GetAllCategories)
    }
    router.GET("/category_detail", controller.GetCategoriesById)
    products := router.Group("/products")
    {
        products.GET("/", controller.GetAllProducts_by_multi_params)
    }
...
go user-agent go-gin
2个回答
2
投票

也许你可以将

getUserAgent 
作为中间件,如下所示 每个路由器都会首先进入
getUserAgent
然后运行处理程序。

router.Use(getUserAgent)

0
投票

你可以把它做成这样的中间件:

package middlewares

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func CheckUserAgent() gin.HandlerFunc {
    return func(c *gin.Context) {
        ua := ua.Parse(c.Request.UserAgent())
        
        if ua.Bot {
            c.AbortWithStatus(http.StatusForbidden)
            return
        }

        c.Next()
    }
}

请注意,您还需要从包中导入“ua”。 然后将中间件添加到您需要保护的路由中,如下所示:

products := router.Group("/products")
{
    products.GET("/", middlewares.CheckUserAgent(), controller.GetAllProducts_by_multi_params)
}
© www.soinside.com 2019 - 2024. All rights reserved.