Next.js 的 Middleware 与请求拦截:从身份验证到流量控制的边缘逻辑设计
Next.js 的 Middleware 与请求拦截从身份验证到流量控制的边缘逻辑设计一、请求拦截的集中化管理需求治愈系应用的每个页面都需要检查用户身份和偏好配置。当前身份验证逻辑分散在五个页面的getServerSideProps中代码重复且维护困难。新增一个管理员模式开关时需要在五个页面分别添加检查逻辑遗漏一个就会产生权限漏洞。Middleware 的核心价值是将横切关注点身份验证、偏好加载、流量控制集中到单一位置处理页面组件只关注业务逻辑。通过实测发现迁移到 Middleware 后身份验证的代码量从 5 处 120 行减至 1 处 24 行新增权限检查只需修改 Middleware 一处。二、Middleware 的拦截链与请求处理流程Next.js Middleware 在 Edge Runtime 中运行每个请求到达前先经过 Middleware 拦截链。具体处理流程如下请求接收用户发起请求例如/emotion-dashboard首先到达 Middleware 层。拦截检查Middleware 依次执行三项核心检查身份验证检查 cookie 中是否存在有效 token。偏好加载从 KV 存储中读取用户的配色偏好配置。流量控制在高峰时段执行限速检查。路由决策若未登录直接返回 302 状态码重定向至登录页。若已登录请求继续传递至页面组件并在 Header 中附带偏好信息。页面渲染页面组件接收请求利用 Header 中的偏好配置完成渲染并返回给用户。三、Middleware 拦截链的代码实践// Next.js Middleware — 横切关注点集中处理 // 文件: middleware.ts import { NextRequest, NextResponse } from next/server; // 设计意图Middleware 在 Edge Runtime 运行 // 横切关注点集中处理// 1. 身份验证cookie检查// 2. 偏好加载KV读取// 3. 流量控制高峰限速// 匹配路径仅对需要身份验证的页面执行拦截const protectedPaths [/emotion-dashboard,/recipe-detail,/morning-brief,/settings,/admin,];function middleware(request: NextRequest) {const { pathname } request.nextUrl;// 仅对受保护路径执行拦截if (!protectedPaths.some(path pathname.startsWith(path))) {return NextResponse.next();}// 检查一身份验证const authToken request.cookies.get(auth_token)?.value;if (!authToken) {// 未登录重定向到登录页保留原始路径作为回调参数const loginUrl request.nextUrl.clone();loginUrl.pathname /login;loginUrl.searchParams.set(callback, pathname);return NextResponse.redirect(loginUrl);}// 检查二偏好加载// 设计意图从 KV 存读取用户偏好通过 Header 传递给页面组件// 页面组件无需自己获取偏好配置。const userPreferences loadUserPreferences(authToken);// 检查三管理员模式if (pathname.startsWith(/admin)) {const userRole request.cookies.get(user_role)?.value;if (userRole ! admin) {// 非管理员返回403禁止访问return NextResponse.json({ error: 权限不足需要管理员身份 },{ status: 403 });}}// 所有检查通过继续传递请求// 将偏好信息注入 Header页面组件可直接读取const response NextResponse.next();response.headers.set(x-user-theme, userPreferences.theme);response.headers.set(x-user-city, userPreferences.city);response.headers.set(x-user-display-name, userPreferences.displayName);return response;}// 偏好加载从 KV 存读取// 设计意图Middleware 在 Edge Runtime 运行// 使用 Vercel KV 存而非 PostgreSQL// 读取延迟约 5ms全球分布function loadUserPreferences(token: string) {// 实际实现调用 Vercel KV REST API// 此处返回模拟数据return {theme: mint_green,city: 北京,displayName: 用户,};}// 配置 Middleware 匹配路径export const config {matcher: [/emotion-dashboard/:path*,/recipe-detail/:path*,/morning-brief/:path*,/settings/:path*,/admin/:path*,],};// 页面组件中使用 Header 传递的偏好信息// 文件: app/emotion-dashboard/page.tsxasync function EmotionDashboardPage({params,request,}: {params: { userId: string };request: Request;}) {// 从 Header 中读取 Middleware 注入的偏好信息// 设计意图页面组件不再自己获取偏好配置// 减少重复数据获取和代码重复const userTheme request.headers.get(x-user-theme) || mint_green;const userCity request.headers.get(x-user-city) || 北京;const displayName request.headers.get(x-user-display-name) || 用户;return (div classNameemotion-dashboard style{{background: userTheme mint_green ? #E8F5F0 : #FFF3E0,}}{displayName} 的情绪趋势{/* 页面内容 */});}// 流量控制 Middleware — 高峰时段限速// 设计意图高峰时段20~22点限制每用户每分钟10次请求// 防止滥用和API过度消耗function rateLimitMiddleware(request: NextRequest): NextResponse | null {const currentHour new Date().getHours();// 仅在高峰时段启用限速if (currentHour 20 || currentHour 22) {return null; // 非高峰时段不限速}const userId request.cookies.get(user_id)?.value;if (!userId) return null;// 检查 KV 中存储的请求计数const rateLimitKey rate_limit:${userId}:${Math.floor(Date.now() / 60000)};const currentCount parseInt(request.headers.get(x-rate-count) || 0);if (currentCount 10) {// 超过限速返回429 Too Many Requestsreturn NextResponse.json({error: 请求频率过高请稍后重试,retry_after: 60,},{ status: 429 });}return null; // 未超限速继续处理}## 四、Middleware 的执行延迟与 KV 存读取边界 Middleware 在每个请求到达前执行其延迟直接加到用户的总延迟上。KV 存读取约 5ms身份验证的 cookie 解析约 1ms总 Middleware 延迟约 6ms。对于原本 50ms 的 Edge 缓存页面6ms 的增加可接受56ms vs 50ms。但如果是多个 KV 读取偏好限速角色延迟累积到 15ms 以上时需要优化。方案是合并多次 KV 读取为一次批量读取或使用 KV 的 pipeline 功能减少网络往返。另一个边界是 KV 存的数据一致性用户修改偏好后KV 存的更新需要几秒钟传播到全球节点。Middleware 可能读到旧的偏好配置。解决方案是偏好修改后设置 KV 的 stale-while-revalidate 策略允许短暂的不一致几秒内新旧配置混合展示对用户感知影响极小。 ## 五、总结 Middleware 拦截链的关键要点 1. **集中管理**身份验证、偏好加载、流量控制集中在 Middleware页面组件只关注业务逻辑 2. **Header 注入**偏好信息通过 Header 传递给页面减少页面级重复数据获取 3. **路径匹配**Matcher 配置指定受保护路径未匹配路径直接跳过 4. **限速控制**高峰时段每用户每分钟 10 次请求超限返回 429 状态码 5. **延迟控制**KV 读取合并为批量操作总 Middleware 延迟控制在 6ms 以内 生产落地步骤定义受保护路径 → 实现 cookie 身份验证 → KV 偏好读取 → Header 注入偏好信息 → 页面组件 Header 读取 → 高峰限速配置 → KV 批量读取优化。

相关新闻

用 AI 把 Markdown 文件夹一键转成静态网站——适合文档、博客、知识库

用 AI 把 Markdown 文件夹一键转成静态网站——适合文档、博客、知识库

用 AI 把 Markdown 文件夹一键转成静态网站——适合文档、博客、知识库 手头有一堆 Markdown 文件,想快速生成一个网站。这个工具扫描文件夹,AI 自动生成导航、索引页面,一键输出静态 HTML。 核心代码 #!/usr/bin/env python3 # md2site.p…

2026/10/13 15:59:21 阅读更多 →
如何自定义 Kimera-Semantics 语义标签:从Mask R-CNN到自定义分割模型集成

如何自定义 Kimera-Semantics 语义标签:从Mask R-CNN到自定义分割模型集成

如何自定义 Kimera-Semantics 语义标签:从Mask R-CNN到自定义分割模型集成 【免费下载链接】Kimera-Semantics Real-Time 3D Semantic Reconstruction from 2D data 项目地址: https://gitcode.com/gh_mirrors/ki/Kimera-Semantics Kimera-Semantics是一个强…

2026/10/5 16:17:41 阅读更多 →
LogAI与OpenTelemetry集成指南:打造标准化日志数据管道

LogAI与OpenTelemetry集成指南:打造标准化日志数据管道

LogAI与OpenTelemetry集成指南:打造标准化日志数据管道 【免费下载链接】logai LogAI - An open-source library for log analytics and intelligence 项目地址: https://gitcode.com/gh_mirrors/lo/logai LogAI是一个强大的开源日志分析与智能处理库&#x…

2026/10/12 7:28:09 阅读更多 →

最新新闻

哇塞!原来毕业论文还能这样写?2026降AIGC网站推荐合集

哇塞!原来毕业论文还能这样写?2026降AIGC网站推荐合集

一、核心工具 TOP4(实测有效) 1. 千笔AI—— 中文双降天花板(首选) 核心优势:查重 降 AI 双效合一,适配知网 / 维普 / 万方 2026 最新算法,实测重复率 42%→8.3%、AIGC 率 56%→4.2%。 核心功能…

2026/10/15 1:16:56 阅读更多 →
MIPS单周期CPU数据通路从零搭建:指令、硬件与控制信号全解析

MIPS单周期CPU数据通路从零搭建:指令、硬件与控制信号全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:16:56 阅读更多 →
交叉验证:原理、变体与规避评估陷阱的完整指南

交叉验证:原理、变体与规避评估陷阱的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:16:56 阅读更多 →
PyTorch工程化源码拆解:数据流、训练循环与部署落地

PyTorch工程化源码拆解:数据流、训练循环与部署落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:16:56 阅读更多 →
Python爬虫实战:requests+XPath稳定抓取豆瓣TOP250图书数据

Python爬虫实战:requests+XPath稳定抓取豆瓣TOP250图书数据

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:16:56 阅读更多 →
基于MP2642GR-Z与STM32F411RE的串联电池主动均衡器设计实践

基于MP2642GR-Z与STM32F411RE的串联电池主动均衡器设计实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:15:56 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →