Middlerwares
中间件:请求管道
什么是中间件?
中间件是位于传入请求和控制器/处理程序之间的函数(或组件)。
它可以:
- 检查请求
- 修改请求
- 阻止请求
- 修改响应
- 记录请求
- 添加安全检查
在你的控制器运行之前。
将中间件视为:
进入主楼前的安全检查站。
🏗 中间件在流程中的位置
客户
↓
中间件1
↓
中间件2
↓
中间件3
↓
控制器(处理程序)
↓
服务
↓
存储库
↓
数据库
每个请求在到达控制器之前都会经过中间件。
为什么需要中间件?
没有中间件:
- 控制器过载
- 安全逻辑被重复
- 记录逻辑到处重复
- 难以执行全球政策
中间件解决:
- 集中安全
- 集中记录
- 集中验证
- 更清洁的控制器
- 更好的可扩展性
它解决了什么问题?
重复问题
而不是在每个控制器中编写身份验证逻辑:
1 | if not verify_token(): |
真实示例流程
用户发送请求:
1 | GET /profile |
步骤 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 之前运行 → 敏感数据可能会被错误记录。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 xhj的博客!