在echo框架中需用middleware.bodylimit中间件限制请求体大小,全局配置用e.use(middleware.bodylimit("10m")),路由级配置调用.use()绑定,自定义错误响应可通过bodylimitwithconfig、外层handler或httperrorhandler实现。

在Echo框架中为接口设置请求体大小上限,防止恶意大请求拖垮服务或触发OOM,必须用middleware.BodyLimit中间件包裹Handler,且需确保它在任何Body读取操作之前生效。
使用默认BodyLimit中间件
这一步最常用,适用于所有POST/PUT等带Body的接口统一限流。
在Echo实例初始化后,直接调用e.Use(middleware.BodyLimit("10M"))即可全局启用限制。单位支持K、M、G(如"2K"、"50M"、"1G"),解析后自动转为字节数。
该中间件内部调用http.MaxBytesReader包装r.Body,并在超限时返回413 Request Entity Too Large响应,同时关闭连接。
【注意:若你在自定义JWT中间件里提前调用了r.ParseForm()或io.ReadAll(r.Body),此中间件将完全失效】
按路由路径差异化配置BodyLimit
当/login接口只需2MB而/upload需100MB时,不能只靠全局中间件——必须为特定路由单独套一层BodyLimit。
第一步:定义上传专用中间件uploadLimit := middleware.BodyLimit("100M")
第二步:绑定到具体路由e.POST("/upload", uploadHandler).Use(uploadLimit)
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
第三步:确认handler内未绕过绑定逻辑
比如避免直接用json.NewDecoder(c.Request.Body).Decode(),而应优先走c.Bind()——因为Bind()底层会触发已包装的r.Body,而裸解码会跳过限制。
这一步操作起来很简单,直接把中间件传给.Use()就行,但必须放在.Handler()或.HandlerFunc()之前,顺序错则无效。
自定义BodyLimit错误响应
方法一:用BodyLimitWithConfig覆盖默认错误行为
创建配置结构体,指定Limit和ErrorMessage字段,例如设为"Payload too large, max 5MB allowed"。
方法二:在中间件外层再包一层自定义Handler
先调用middleware.BodyLimit("5M"),再用http.HandlerFunc捕获http.ErrContentLength错误并写入自定义JSON响应体。
方法三:配合Echo的HTTPErrorHandler统一拦截
在e.HTTPErrorHandler = func(err error, c echo.Context) { ... }中判断errors.Is(err, http.ErrContentLength),然后返回结构化错误。










