zoukankan      html  css  js  c++  java
  • 接口访问限制

    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
    请求体限制

  • 相关阅读:
    避免使用HttpClient的系统代理
    C#使用ILGenerator动态生成函数
    leveldb和fork的初始化顺序
    模拟阻尼运动
    [c++]printf的编译器静态检测
    Git Submodule管理项目子模块
    redis 读写分离主从服务类借鉴
    git pull 冲突
    git log 查看提交记录
    自带单例模式的redis类
  • 原文地址:https://www.cnblogs.com/tomtellyou/p/14108250.html
Copyright © 2011-2022 走看看