接口访问限制
1.限制接口访问频率
package main
import (
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
"golang.org/x/time/rate"
)
type (
RateLimitConfig struct {
// Skipper defines a function to skip middleware.
Skipper middleware.Skipper
Limit int
Burst int
}
)
var DefaultRateLimitConfig = RateLimitConfig{
Skipper: middleware.DefaultSkipper,
Limit: 2,
Burst: 1,
}
func RateLimitMiddleware() echo.MiddlewareFunc {
return RateLimitWithConfig(DefaultRateLimitConfig)
}
func RateLimitWithConfig(config RateLimitConfig) echo.MiddlewareFunc {
// Defaults
if config.Skipper == nil {
config.Skipper = DefaultRateLimitConfig.Skipper
}
var limiter = rate.NewLimiter(rate.Limit(config.Limit), config.Burst)
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
if config.Skipper(c) {
return next(c)
}
if limiter.Allow() == false {
return echo.ErrTooManyRequests
}
return next(c)
}
}
}
2.请求体大小限制
BodyLimit 中间件用于设置允许的请求体的最大长度,如果请求体的大小超过了该值,则返回”413 - Request Entity Too Large”响应。
这个限制的判断取决于请求头的 Content-Length 和实际读取到的请求体内容两方面,尽可能的保证安全。
限制可以指定 4x 或者 4xB,x是”K, M, G, T, P”中的一个
e := echo.New()
e.Use(middleware.BodyLimit("2M"))
自定义配置
e := echo.New()
e.Use(middleware.BodyLimitWithConfig(middleware.BodyLimitConfig{}))
// 配置
BodyLimitConfig struct {
// Skipper 定义了一个跳过中间间的函数
Skipper Skipper
// 请求体被允许的最大值,可以被指定为类似“4x”和“4xB”这样的值,
// x 是 K,M,G,T,P 中的一个。
Limit string `json:"limit"`
}
// 默认配置
DefaultBodyLimitConfig = BodyLimitConfig{
Skipper: defaultSkipper,
}
相关链接
【励志篇】:
古之成大事掌大学问者,不惟有超世之才,亦必有坚韧不拔之志。