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

Next.js 13.4中间件存储序列化对象到Cookie的URL编码问题

解决Next.js 13.4 App Router中间件Cookie自动URL编码问题

问题原因

Next.js的NextResponse.cookies.set方法默认会对Cookie值执行URL编码,这是遵循HTTP Cookie规范的行为(Cookie值不允许包含空格、逗号、分号等特殊字符)。而客户端使用document.cookie设置时,浏览器可能自动处理了编码/解码逻辑,或者你在读取时隐式完成了解码,所以看起来没有编码问题。

解决方案

方案1:读取Cookie时解码(推荐)

不管是在中间件还是客户端读取Cookie,使用decodeURIComponent()解码后再解析JSON:

中间件中读取

import { NextRequest } from "next/server";

export async function middleware(request: NextRequest) {
  const settingsCookie = request.cookies.get('settings')?.value;
  if (settingsCookie) {
    // 解码后解析JSON
    const settings = JSON.parse(decodeURIComponent(settingsCookie));
    // 使用settings对象
  }
}

客户端读取

const getSettingsFromCookie = () => {
  const cookieStr = document.cookie;
  const settingsEntry = cookieStr.split('; ').find(row => row.startsWith('settings='));
  if (settingsEntry) {
    const encodedValue = settingsEntry.split('=')[1];
    const settings = JSON.parse(decodeURIComponent(encodedValue));
    return settings;
  }
  return null;
};

方案2:设置Cookie时禁用编码(需谨慎)

如果确定你的Cookie值不会包含HTTP Cookie禁止的字符,可以通过encode选项跳过编码:

// 在fetchSettings函数中修改setCookie的代码
nextResponse.cookies.set("settings", JSON.stringify(settings), {
  encode: (value) => value // 直接返回原值,不编码
});

注意:此方法存在风险,如果Cookie值包含空格、逗号、分号等特殊字符,会导致Cookie无法正常存储或读取,建议优先使用方案1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:32:43