fiber非法请求拦截中间件需在函数开头判断条件,不满足时直接返回c.status(400).sendstring()等响应且不调用c.next();若调用c.next()则继续执行后续路由,常见错误是遗漏return或误调c.next()。

Fiber 框架没有 Spring Boot 那样的 HandlerInterceptor,中间件必须用 app.Use() 或 app.Add() 显式注册,且顺序决定执行链;非法请求拦截逻辑必须写在 preHandle 类似位置——也就是中间件函数的开头,靠 ctx.Next() 控制是否放行。
怎么写一个基础的非法请求拦截中间件
核心是判断条件后直接调用 ctx.Status(400).SendString() 或类似响应,并 不调用 ctx.Next()。一旦跳过 ctx.Next(),后续路由和处理器就完全不会执行。
常见错误现象:写了拦截逻辑但请求仍进到 handler,说明忘了 return 或误调了 ctx.Next();返回 200 却没内容,可能是没调 SendString() 或用了异步未 await。
- 拦截器函数必须是
func(c *fiber.Ctx) error类型 - 判断失败时,立即
return c.Status(403).JSON(fiber.Map{"error": "forbidden"}) - 判断通过才调
return c.Next(),否则必须显式 return 错误或响应 - 不要在中间件里用
defer做“兜底放行”,它无法中断已开始的流程
如何拦截特定路径下的非法请求(比如 /api/v1/user)
Fiber 不支持像 Spring 的 addPathPatterns().excludePathPatterns() 那种声明式路径配置,路径控制全靠中间件内部判断 c.Path() 或 c.OriginalURL(),或者用 app.Group() 分组注册。
使用场景:只对 /api/** 下的请求做 IP 黑名单或参数校验,静态资源 /public/ 或健康检查 /health 不走该逻辑。
- 推荐用
app.Group("/api")创建子路由,再对其调用.Use(authMiddleware) - 若需动态排除,中间件内用
strings.HasPrefix(c.Path(), "/api/") && !strings.HasPrefix(c.Path(), "/api/public/") - 注意
c.Path()是解析后的路径(不含 query),c.OriginalURL()含完整 URL - 路径匹配别依赖正则反复调用
regexp.MatchString,高频请求下有性能损耗
怎么安全读取并校验请求 Body 而不破坏后续处理
Fiber 的 c.Body() 可多次读取,但原始 io.ReadCloser 流只能读一次。如果你手动调用 c.Request().Body() 或 c.Request().RequestBody(),会消耗底层流,导致后续 c.Body() 或结构体绑定(如 c.Struct(&v))失败。
容易踩的坑:想校验 JSON body 里的字段是否存在、是否超长,结果 controller 收不到数据。
- 统一用
c.Body()获取原始字节,校验完再传给结构体解析:json.Unmarshal(c.Body(), &req) - 避免直接操作
c.Request().Body;如必须,需用fasthttp.RequestCtx.SetBodyRaw()重置(不推荐) - 敏感词检测等字符串扫描,直接对
c.Body()返回的[]byte操作,别转成 string 再切片(零拷贝更稳) - 大 body(>1MB)建议加长度限制中间件,用
c.Request().Header.ContentLength提前拦截
为什么 Token 校验中间件总在登录接口里失效
因为登录接口本身就不该被 Token 校验拦截——否则永远无法登录。关键不是“怎么写校验”,而是“怎么绕过”。Fiber 没有 exclude 机制,绕过只能靠路径判断或方法判断。
真实调试中常见问题:加了中间件后,POST /login 返回 401,日志显示 token 校验逻辑被执行了。
- 在中间件开头加白名单判断:
if c.Path() == "/login" && c.Method() == "POST" { return c.Next() } - 更健壮的做法是提取出「无需鉴权的路由集合」,用 map 查找:
if noAuthRoutes[c.Path()] { return c.Next() } - 别用
c.Get("Authorization") == ""当放行条件——空 header 不等于该接口可跳过校验 - 登录成功后 set-cookie 或返回 token,这些动作和拦截逻辑无关,别混在同一个中间件里
最易被忽略的一点:Fiber 中间件是同步执行的,所有校验逻辑必须在单次调用内完成;没法像 Spring Interceptor 那样分 pre/post/after 多阶段。想实现“记录耗时+异常捕获+清理”,得靠 defer + 全局 error handler 配合,而不是拆成多个中间件函数。











