You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 14中如何在Middleware读取表单Action设置的Cookie?

解决Next.js 14中Middleware无法读取Cookie的问题

1. 先确认Cookie名称是否匹配

你在/login/action.ts里设置的Cookie名称是session,但Middleware里尝试读取的是token——这是最直接的错误,先把Middleware里的读取名称改成session再测试。

2. 检查Cookie的path属性设置

在App Router的Action中使用cookies().set()时,默认path是当前Action所在的路由路径(比如你的/login/action.ts对应路径为/login),这意味着只有/login及其子路径能读取到该Cookie,其他路由的Middleware自然拿不到。

解决方法是显式设置全局路径:

// /login/action.ts 中的Cookie设置代码
import { cookies } from 'next/headers';

export async function loginAction() {
  // ... 用户验证逻辑
  cookies().set('session', 'your-jwt-token', {
    path: '/', // 关键:设置为根路径,让所有路由可访问
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production', // 开发环境设为false,生产环境必须设为true
    maxAge: 60 * 60 * 24 * 7, // 有效期7天
    sameSite: 'lax',
  });
  // ... 重定向逻辑
}

3. 确认Middleware中读取Cookie的方式正确

Next.js 14的Middleware必须通过NextRequest对象的cookies读取,不能使用next/headers导出的cookies()(后者仅适用于Server Components、Actions):

// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
  // 注意:这里是request.cookies,不是import的cookies()
  const sessionCookie = request.cookies.get('session');
  console.log(sessionCookie); // 现在应该能拿到值了

  // ... 受保护路由逻辑
}

export const config = {
  matcher: ['/dashboard/:path*'], // 按需设置需要保护的路由
};

4. 排查重定向与Cookie生效时机

如果登录Action中设置Cookie后立即执行redirect,要确保cookies().set()在重定向前执行完成——Next.js会在响应发送前处理Cookie设置,但如果有异步逻辑,需确保Cookie设置代码已执行。

5. 清除缓存

开发环境中,浏览器或Next.js的缓存可能导致状态异常:

  • 打开浏览器开发者工具,清除对应域名的Cookie
  • 重启Next.js开发服务器
  • 在开发者工具中勾选「Disable cache」禁用浏览器缓存

6. 检查Cookie的secure和SameSite属性

  • 开发环境未使用HTTPS时,secure必须设为false,否则浏览器不会保存Cookie
  • SameSite设为lax是安全的默认值,若设为strict,在部分跳转场景(如外部链接进入)可能无法携带Cookie

内容的提问来源于stack exchange,提问作者ChuChuwi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:00:54