打赏

接口访问限制

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,
}

相关链接

beego限制接口访问频率
echo限制接口访问频率
访问频率
github-tollbooth
请求体限制

posted @ 2020-12-09 14:12  苍山落暮  阅读(378)  评论(0编辑  收藏  举报