Nextjs15 - middleware的使用
nextjs 官方文档(current branch 对应如下文档)
- Middleware
- path-to-regexp
本专栏内容均可在Github:test_05/Middleware 找到
一、middleware 基本使用
中间件允许您在请求完成之前运行代码。然后,根据传入的请求,您可以通过重写、重定向、修改请求或响应标头或直接响应来修改响应。
使用项目根目录中的 middleware.ts 文件(或 .js )来定义中间件。例如,与 pages 或 app 处于同一级别,或者在 src 内(如果适用)。
注意 :
虽然每个项目仅支持一个 middleware.ts 文件,但您仍然可以模块化地组织中间件逻辑。将中间件功能分解为单独的 .ts 或 .js 文件,然后将其导入主 middleware.ts 文件。这样可以更清晰地管理路由特定的中间件,这些中间件会汇总在 middleware.ts 中以便进行集中控制。通过强制使用单个中间件文件,可以简化配置、防止潜在冲突并通过避免多个中间件层来优化性能。
Example:
将 /about/** 所有路由访问重定向到 /home,见:middleware.ts
import { NextRequest, NextResponse } from "next/server";export const middleware = (request: NextRequest) => {// 请求路由为 /about/** 重定向到 /homereturn NextResponse.redirect(new URL("/home", request.url));
};/** 配置匹配路径 */
export const config = {matcher: "/about/:path*",
};
matcher 的语法参考 path-to-regexp
我们也可以不使用 matcher,而是在 middleware 中使用条件语句进行判断,见:middleware.ts
import { NextRequest, NextResponse } from "next/server";export const middleware = (request: NextRequest) => {// 将 url 开头为 /about 的请求重定向到 /homeif (request.nextUrl.pathname.startsWith("/about")) {return NextResponse.redirect(new URL("/home", request.url));}
};
二、在中间件中使用 Cookies
Cookies 是常规标头。在 Request 中,它们存储在 Cookie 标头中。在 Response 中,它们位于 Set-Cookie 标头中。Next.js 通过 NextRequest 和 NextResponse 上的 cookies 扩展提供了一种访问和操作这些 cookie 的便捷方法。
对于传入请求, cookies 具有以下方法:
- get
- getAll
- set
- delete cookies
您可以使用 has 检查 cookie 是否存在,或使用 clear 删除所有 cookie。
对于传出的响应, cookies 具有以下方法
- get
- getAll
- set
- delete

见:middleware.ts
/** 二、中间件中使用 cookies */
export const middleware = (request: NextRequest) => {// cookie { name: 'vercel', value: '31321' }console.log(request.cookies.get("vercel"));/*** cookies [* { name: 'vercel', value: '31321' },* { name: 'nextjs', value: '333' }* ]*/console.log(request.cookies.getAll());// trueconsole.log("1、is has vercel :", request.cookies.has("vercel"));request.cookies.delete("vercel");// falseconsole.log("2、is has vercel :", request.cookies.has("vercel"));/** 设置 cookie */const response = NextResponse.next();response.cookies.set("vercel", "333");response.cookies.set({name: "vercel",value: "333",path: "/",});console.log("3、vercel:", response.cookies.get("vercel"));return response;
};

三、在中间件中使用 Headaers
我们可以使用 NextResponse API 设置请求和响应标头(自 Next.js v13.0.0 起可以设置请求标头)。
见:middleware.ts
/** 三、在中间件中使用 Headers */
export const middleware = (request: NextRequest) => {const headers = new Headers(request.headers);headers.set("token", "this is my token");// 通过 NextResponse.next() 的配置对象来修改请求const response = NextResponse.next({request: {headers: headers, // 修改请求头},});// 通过 response 的 headers 来修改响应头response.headers.set("token", "this is my token");return response;
};
四、在中间件中使用 CORS
我们可以在中间件中设置 CORS 标头以允许跨源请求,包括简单的并已预检要求。
见:middleware.ts
/** 四、在中间件中使用 CORS */
// 定义允许跨域访问的源站列表
const allowedOrigins = ["https://example.com", "https://sub.example.com"];// 定义 CORS 相关的配置选项
const corsOptions = {// 允许的 HTTP 请求方法"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",// 允许的请求头"Access-Control-Allow-Headers": "Content-Type, Authorization",
};export const middleware = (request: NextRequest) => {// 获取请求的源站地址,如果没有则设为空字符串const origin = request.headers.get("origin") ?? "";// 检查请求的源站是否在允许列表中const isAllowedOrigin = allowedOrigins.includes(origin);// 判断是否为预检请求(OPTIONS 请求)const isOptions = request.method === "OPTIONS";// 处理预检请求if (isOptions) {// 构建预检响应的头部信息const preflightHeaders = {// 如果是允许的源站,则添加 Access-Control-Allow-Origin 头...(isAllowedOrigin && { "Access-Control-Allow-Origin": origin }),// 展开其他 CORS 配置选项...corsOptions,};// 返回预检响应,状态码默认为 200return NextResponse.json({}, { headers: preflightHeaders });}// 处理非预检请求const response = NextResponse.next();// 为所有响应添加 CORS 头部信息Object.entries(corsOptions).forEach(([key, value]) => {response.headers.set(key, value);});return response;
};// 配置中间件只对 API 路由生效
export const config = {matcher: "/api/:path*",
};
五、如何直接响应
我们可以通过返回 Response 或 NextResponse 实例直接从中间件进行响应。(此功能自 Next.js v13.1.0 开始可用 )
export const config = {matcher: "/api/:function*",
};export const middleware = (request: NextRequest) => {// 鉴权判断if (!isAuthenticated(request)) {// 返回错误信息return new NextResponse(JSON.stringify({ success: false, message: "authentication failed" }),{ status: 401, headers: { "content-type": "application/json" } });}
};
相关文章:
Nextjs15 - middleware的使用
nextjs 官方文档(current branch 对应如下文档) Middlewarepath-to-regexp 本专栏内容均可在Github:test_05/Middleware 找到 一、middleware 基本使用 中间件允许您在请求完成之前运行代码。然后,根据传入的请求,您…...
PHP If...Else 语句详解
PHP If...Else 语句详解 引言 PHP 是一种流行的服务器端脚本语言,常用于开发动态网站和应用程序。在 PHP 编程中,条件语句是编程逻辑的基础,其中 if...else 语句是最基本且最常用的条件语句之一。本文将详细介绍 PHP 的 if...else 语句&…...
Django之旅:第六节--mysql数据库操作增删改查(二)
前提条件(models.py已经设置好): from django.db import mmodelsclass UserInfo(models.Model):namemodels.CharFIeld(max_length32)passwordmodels.CharFIeld(max_length64)#agemodels.IntegerFIeld()操作数据语法(在views.py文件࿰…...
【SUNO】【AI作词】【提示词】
仿写歌词提示词模板(升级版) 一、仿写目标 风格定位 音乐风格: [填写目标风格,如:民谣/流行/古风/电子/爵士等]参考案例:如《成都》的叙事民谣,《孤勇者》的励志流行。 情感基调: […...
边缘计算 vs. 云计算,谁才是工业物联网的未来?
前言 在物联网(IoT)飞速发展的今天,边缘计算正在彻底改变数据的处理、存储和分析方式。传统的IoT设备数据通常需要发送到云端进行处理,但随着设备数量的激增,这种模式在延迟、带宽和安全性方面暴露出诸多局限。边缘计…...
【Qt】QByteArray详解
QByteArray 是 Qt 框架中用于处理原始字节数据的核心类,其实质可以概括为以下几点: 1. 底层数据结构 • 连续内存块:存储一段连续的字节数据(char*),类似 std::vector<char>,但针对 Qt 框…...
leetcode.189.轮转数组
第一次全反转,第二次反转前k个,第三次反转后n-k个 需要注意的是向又轮转k个时,如果超出数组长度,要对其进行取模运算才是正确的向右轮转个数 class Solution { private:void rotate(vector<int>& nums,int start,int …...
OCR 识别案例
OCR 识别案例 注意点:输入图像尺寸比例尽量和参与模型训练的数据集比例相似,识别效果会更好。 1、pytesseract Pytesseract是一个Python的光学字符识别(OCR)工具,它作为Tesseract OCR引擎的封装,允许你在…...
微信 MMTLS 协议详解(五):加密实现
常用的解密算法,对称非对称 加密,密钥协商, 带消息认证的加解密 #生成RSA 密钥对 void GenerateRsaKeypair(std::string& public_key,std::string& private_key) {RSA* rsa RSA_new();BIGNUM* bn BN_new();// 生成 RSA 密钥对BN_s…...
Mybatis配置文件解析(详细)
引言 在了解Mybatis如何帮助客户进行数据的存取后,便对Mybatis的配置文件起了兴趣,在查阅官方文档后,总结了平时能用到的配置,希望能对大家有帮助 1.核心配置文件 主要是指Mybatis-config.xml中 其包含了会深深影响Mybatis行为…...
有额外限制的 bellman_ford 算法
题目链接 1.有限制的 B e l l m a n _ F o r d Bellman\_Ford Bellman_Ford 时间复杂度: O ( N ∗ M ) O(N*M) O(N∗M) 在传统的 B e l l m a n _ F o r d Bellman\_Ford Bellman_Ford 中,可以处理边数不大于 K K K 条边的最短距离 但我们只要加一条限制(实际…...
深度剖析 Spring 源码 性能优化:核心原理与最佳实践
深度剖析 Spring 源码 & 性能优化:核心原理与最佳实践 🚀 Spring 框架 作为 Java 生态的核心技术,广泛应用于企业级开发。但很多开发者只会“用”Spring,而不深入其内部原理,导致无法高效排查问题 & 进行性能优…...
【BFS】《单源、多源 BFS:图搜索算法的双生力量》
文章目录 前言单源BFS例题一、迷宫中离入口最近的出口二、 最小基因变化三、单词接龙四、为高尔夫比赛砍树 多源BFS例题一、 01 矩阵二、飞地的数量三、地图中的最高点四、地图分析 结语 前言 什么是单源、多源BFS算法问题呢? BFS(Breadth - First Sear…...
【2025】基于springboot+vue的医院在线问诊系统设计与实现(源码、万字文档、图文修改、调试答疑)
基于Spring Boot Vue的医院在线问诊系统设计与实现功能结构图如下: 课题背景 随着互联网技术的飞速发展和人们生活水平的不断提高,传统医疗模式面临着诸多挑战,如患者就医排队时间长、医疗资源分配不均、医生工作压力大等。同时,…...
【前端】原生项目与框架项目区别
不定期更新,建议关注收藏点赞。 使用 HTML CSS JS 和 Vue 或 React 开发的项目各有其优势与不足,适用于不同的场景。目前基本上都采用框架, 总结 何时选择 HTML CSS JS: 适用于 小型项目、简单静态页面、不需要复杂交互 或 …...
STM32基础教程——PWM驱动舵机
目录 前言 技术实现 原理图 接线图 代码实现 内容要点 PWM基本结构 开启外设时钟 配置GPIO端口 配置时基单元 初始化输出比较单元 调整PWM占空比 输出比较通道重映射 舵机角度设置 实验结果 问题记录 前言 舵机(Servo)是一种位置ÿ…...
ThreadLocal详解与高频场景实战指南
ThreadLocal详解与高频场景实战指南 1. ThreadLocal概述 ThreadLocal是Java提供的线程本地变量机制,用于实现线程级别的数据隔离。每个访问该变量的线程都会获得独立的变量副本,适用于需要避免线程间共享数据的场景。 特点: 线程封闭性&a…...
odata 搜索帮助
参考如下链接: FIORI ELement list report 细节开发,设置过滤器,搜索帮助object page跳转等_fiori element label 变量-CSDN博客 注:odata搜索帮助可以直接将值带出来,而不需要进行任何的重定义 搜索帮助metedata配置…...
RK3588开发笔记-RTL8852wifi6模块驱动编译报错解决
目录 前言 一、问题背景 二、驱动编译 总结 前言 在基于 RK3588 进行开发,使用 RTL8852 WiFi6 模块时,遇到了一个让人头疼的驱动编译报错问题:“VFs_internal_I_am_really_a_filesystem_and_am_NoT_a_driver, but does”。经过一番摸索和尝试,最终成功解决了这个问题,在…...
Docker基本命令VS Code远程连接
Docker基本命令 创建自己的docker容器:docker run --net host --name Container_name --gpus all --shm-size 1t -it -v Your_Path:Your_Dir mllm:mac /bin/bashdocker run:用于创建并启动一个新容器-name:为当前新建的容器命名-gpus&#x…...
第二天 开始Unity Shader的学习之旅之熟悉顶点着色器和片元着色器
Shader初学者的学习笔记 第二天 开始Unity Shader的学习之旅之熟悉顶点着色器和片元着色器 文章目录 Shader初学者的学习笔记前言一、顶点/片元着色器的基本结构① Shader "Unity Shaders Book/Chapter 5/ Simple Shader"② SubShader③ CGPROGRAM和ENDCG④ 指明顶点…...
大疆上云api直播功能如何实现
概述 流媒体服务器作为直播画面的中转站,它接收推流端的相机画面,同时拉流端找它获取相机的画面。整个流程如下: 在流媒体服务器上创建流媒体应用(app),一个流媒体服务器上面可以创建多个流媒体应用约定推拉流的地址。假设流媒体服务器工作在1935端口上面,假设创建的流…...
理解文字识别:一文读懂OCR商业化产品的算法逻辑
文字识别是一项“历久弥新”的技术。早在上世纪初,工程师们就开始尝试使用当时有限的硬件设备扫描并识别微缩胶片、纸张上的字符。随着时代和技术的发展,人们在日常生活中使用的电子设备不断更新换代,文字识别的需求成为一项必备的技术基础&a…...
使用 Cursor、MCP 和 Figma 实现工程化项目自动化,提升高达 200% 效率
直接上手不多说其他的! 一、准备动作 1、Cursor下载安卓 1.1访问官方网站 打开您的网络浏览器,访问 Cursor 的官方网站:https://www.cursor.com/cn 1.2开始下载: 点击"Download for free" 根据您的浏览器设置,会自…...
Arduino、ESP32驱动GUVA-S12SD UV紫外线传感器(光照传感器篇)
目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 UV紫外线传感器是一个测试紫外线总量的最佳传感器,它不需要使用波长滤波器,只对紫外线敏感。 Arduino UV紫外线传感器,直接输出对应紫外线指数(UV INDEX)的线性电压,输出电压范围大约0~1100mV(对应UV INDEX值…...
PTA 1097-矩阵行平移
给定一个𝑛𝑛nn的整数矩阵。对任一给定的正整数𝑘<𝑛k<n,我们将矩阵的奇数行的元素整体向右依次平移1、……、𝑘、1、……、𝑘、……1、……、k、1、……、k、……个位置,平移…...
Notepad++ 替换 换行符 为 逗号
多行转一行,逗号分隔 SPO2025032575773 SPO2025032575772 SPO2025032575771 SPO2025032575771 SPO2025032575770为了方便快速替换,我们需要先知道这样类型的数据都存在哪些换行符。 点击【视图】-【显示符号】-【显示行尾符】 对于显示的行尾换行符【C…...
使用飞书API自动化更新共享表格数据
飞书API开发之自动更新共享表格 天马行空需求需求拆解1、网站数据爬取2、飞书API调用2.1 开发流程2.2 创建应用2.3 配置应用2.4 发布应用2.5 修改表格权限2.6 获取tenant_access_token2.7 调用API插入数据 总结 天马行空 之前一直都是更新的爬虫逆向内容,工作中基本…...
使用vscode搭建pywebview集成vue项目示例
文章目录 前言环境准备项目源码下载一、项目说明1 目录结构2 前端项目3 后端项目获取python安装包(选择对应版本及系统) 三、调试与生成可执行文件1 本地调试2 打包应用 四、核心代码说明1、package.json2、vite.config.ts设置3、main.py后端入口文件说明 参考文档 前言 本节我…...
蓝桥杯嵌入式十六届模拟三
由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…...
