中间件:请求管道


什么是中间件?

中间件是位于传入请求和控制器/处理程序之间的函数(或组件)。

它可以:

  • 检查请求
  • 修改请求
  • 阻止请求
  • 修改响应
  • 记录请求
  • 添加安全检查

在你的控制器运行之前。

将中间件视为:

进入主楼前的安全检查站。


🏗 中间件在流程中的位置

客户

中间件1

中间件2

中间件3

控制器(处理程序)

服务

存储库

数据库

每个请求在到达控制器之前都会经过中间件。


为什么需要中间件?

没有中间件:

  • 控制器过载
  • 安全逻辑被重复
  • 记录逻辑到处重复
  • 难以执行全球政策

中间件解决:

  • 集中安全
  • 集中记录
  • 集中验证
  • 更清洁的控制器
  • 更好的可扩展性

它解决了什么问题?

重复问题

而不是在每个控制器中编写身份验证逻辑:

1
2
if not verify_token():
return 401

真实示例流程

用户发送请求:

1
2
GET /profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

步骤 1️⃣ CORS 中间件

检查:此前端域是否允许?

如果不是:立即拒绝请求

步骤 2️⃣ 速率限制器中间件

检查:此 IP 是否发出超过 100 个请求/分钟?

如果是:返回429 Too Many Requests

步骤 3️⃣ 身份验证中间件
提取 JWT 令牌
验证签名
检查过期时间

如果无效:返回401 Unauthorized

如果有效:将 user_id 附加到请求对象

步骤 4️⃣ 记录器中间件

日志:
端点
方法
知识产权
时间戳
响应状态

步骤5️⃣ 控制器执行

现在请求已安全到达控制器。
控制器已经知道:
用户已通过身份验证
请求有效
速率限制是安全的
所以控制器只关注业务逻辑。

中间件 目的
CORS 检查是否允许前端域与后端通信。
授权 验证 JWT 令牌或会话 ID。如果无效,则使用 401 Unauthorized 中止。
速率限制器 防止单个 IP 发出过多请求(例如,100 个请求/分钟)。
记录器 记录每个调试和审核请求。
错误处理程序 捕获未处理的异常。
请求计时器 测量响应时间。
压缩 压缩响应

中间件排序很重要

正确顺序:

1️⃣ CORS
2️⃣ 速率限制器
3️⃣ 认证
4️⃣ 记录
5️⃣ 控制器
6️⃣ 全局错误处理程序(最后)

如果订单错误会发生什么?

(1)如果 Auth 在 CORS 之前运行 → 浏览器可能会意外阻止请求。
(2) 如果速率限制器在控制器之后运行 → 攻击仍然击中业务逻辑。
(3) 如果 Logger 在 Auth 之前运行 → 敏感数据可能会被错误记录。