Web前端入门第 82 问:JavaScript cookie 有大小限制吗?溢出会怎样?

面试时候经常会被问及 Cookie 大小限制,但一直没尝试写一些 demo 测试下溢出极限值会怎样~~

本文就来看看各种极限情况!

英文

测试代码:

/* by 01022.hk - online tools website : 01022.hk/zh/htmlfromcsv.html */
(() => {
  const maxSize = 4 * 1024; // 4KB
  const name = 'name'
  // 最大出入的 value 长度
  const maxValueStr = 'a'.repeat(maxSize - name.length);
  // firefox 不能使用 Secure
  document.cookie = `${name}=${encodeURIComponent(maxValueStr)};expires=${new Date(2026, 0, 1).toUTCString()};path=/`;
})()

Chrome/Edge/Firefox 浏览器

英文:名字 + 内容 字符串长度限制 4096 字符。

1

各家浏览器的存储面板都能看到 Cookie 大小,此大小包含存入 Cookie 的名字和内容加在一起的长度

不同之处

Chrome/Edge

超过 4KB 大小无法存储,浏览器无报错,也无提示,纯粹毫无感知。

Firefox

超过 4KB 大小会有提示:

/* by 01022.hk - online tools website : 01022.hk/zh/htmlfromcsv.html */
Cookie “name”太大而无效。最大大小为 4096 字节。

比如这段代码存入 cookie 的值超过一个字符:

(() => {
  const maxSize = 4 * 1024 - 5; // 4KB
  const maxStr = 'a'.repeat(maxSize) + 'b1';
  console.log('🚀 ~ maxStr:', maxStr.length);
  document.cookie = `name=${encodeURIComponent(maxStr)};expires=${new Date(2026, 0, 1).toUTCString()};path=/`;
})()

运行有警告:

2

如果在 Firefox 中 localhost 使用 secure 会报错!!

由于非 HTTPS Cookie 无法设置“secure”属性,已拒绝 Cookie “name”。

比如这段代码在本地 localhost 的环境中 Chrome 和 Edge 都能正常运行,但是 Firefox 会报错:

document.cookie = `name=${encodeURIComponent(maxStr)};expires=${new Date(2026, 0, 1).toUTCString()};path=/;Secure;SameSite=Lax`;

报错:

3

中文

一个中文占用3个英文长度!!!

测试代码:

(() => {
  const maxSize = 4 * 1024; // 4KB
  const name = 'name'
  const valueSize = maxSize - name.length
  console.log(valueSize / 3);
  const value = '中'.repeat(Math.floor(valueSize / 3));
  // firefox 不能使用 Secure
  document.cookie = `name=${(value)};expires=${new Date(2026, 0, 1).toUTCString()};path=/`;
})()

4KB 字符串长度减去 name 的长度,除以 3 等于 1364 中文字符长度,刚好是浏览器能存储的极限值。

Firefox 显示的大小比较另类,它没按照转换后的大小显示,而是直接显示了中文值长度 + 英文名称长度,而 Chrome 和 Edge 显示的是占用空间长度。如下图:

4

一般在存储中文的的时候,会用到 encodeURIComponent 编码一下中文字符,这方法编码之后,一个中文字符将会转成 9 个英文字符,使用这种方法存储中文时候需特别注意!!!

5

使用 cookieStore

cookieStore 存入超过大小限制的字符串长度时,会报一个奇奇怪怪的错误,比如:

(async () => {
  const maxSize = 4 * 1024; // 4KB
  const name = 'name'
  const valueSize = maxSize - name.length
  console.log(valueSize / 3);
  const value = '中'.repeat(Math.floor(valueSize / 3));
  const res = await cookieStore.set({
    name: 'name',
    // 比极限值多出一个长度
    value: value + '1',
    expires: new Date(2026, 0, 1).getTime(), // Unix 时间戳(以毫秒为单位表示)
    path: '/',
    sameSite: 'lax'
  })
  console.log('存储结果:', res); // 正常写入返回 undefined
})()

报错:

6

翻译过来的大致意思:由于解析时出现问题,导致 Cookie 格式错误,无法存储。

反正不是明确的告诉开发者长度异常了!!所以在使用 cookieStore 时,需要进行异常捕获。

本文编写时 Firefox 最新版本 138.0.4 还不支持 cookieStore。

单个 Cookie 的大小限制了解了,再看看 Cookie 个数限制。

测试代码:

(async () => {
  document.cookie = ''
  const name = 'name'
  // 最大出入的 value 长度
  let cookieStr = ''
  for (let i = 0; i < 200; i++) {
    document.cookie = `${name + i}=${'a'.repeat(4000)};expires=${new Date(2026, 0, 1).toUTCString()};path=/`;
  }
  // JS 查找 name 出现次数
  console.log(document.cookie.match(/name/g).length)
})()

第一次都能正常打开页面,第二次刷新页面之后都会报错:

7

此问题应该是跟 http 协议的限制有关,请求头发送的 Cookie 长度太长了,导致响应 431 状态码。

Firefox 在页面未正常打卡的情况下还不支持清空 Cookie,需要点击右上角菜单--设置--隐私与安全--清除数据删除保存的超大 Cookie 浏览器才能正常访问。

测试代码:

(async () => {
  function setCookie(name, value) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        document.cookie = `${name}=${value};path=/`;
        resolve()
      }, 5);
    });
  }
  const name = 'name'
  // 最大出入的 value 长度
  let cookieStr = ''
  for (let i = 0; i < 2000; i++) {
    console.log('正在写入:', i);
    await setCookie(name + i, 'a')
  }
  setTimeout(() => {
    // JS 查找 name 出现次数
    console.log(document.cookie?.match(/name/g)?.length)
  }, 1000);
})()

Chrome、Edge、Firefox 浏览器每次刷新写入的 Cookie 个数都不一样,可以复制以上代码在浏览器中测试!

AI 回答:

8

写在最后

根据测试结果可以得出:在使用 Cookie 时只建议用于存入关键数据,而不是用来做相关缓存!!

 

文章首发于微信公众号【前端路引】,欢迎 微信扫一扫 查看更多文章。

本文来自博客园,作者:前端路引,转载请注明原文链接:https://www.cnblogs.com/linx/p/19010392

 

本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值