分享一个关于Cookie做的实验结果
实验本身是很枯燥的,我尽量把它讲的有趣些。
起因
去网上搜了下关于Cookie的介绍,看了好几篇都长得很一样,阉割一下内容不外乎说是"不同浏览器限制cookie数不同,大致在30-50这个范围,(前缀)浏览器允许Cookie多达4KB左右,包括名、值、等号"。
我还在上学那会儿,包括后面毕业后工作一段时间,我也没有特别去关注过这个话题,基本上如果面试官问到我了,也就把网上知道的这些讲了一下。
今年的遭遇给了我思考的时间特别多,最近我又重新去仔细读了下楼上那句话,我发现我读不懂了,第一个,我看的资料并不是特别权威的,也都是网上的博客帖子,对浏览器限制30-50个这个范围产生了一个质疑,是真的吗?第二个是允许多达4KB左右,就很迷糊,到底是一个域名下所有的Cookie加起来的值是4KB左右,还是说单独的Cookie的一个Name所表示的信息它可以是4KB左右,这让我很迷啊。
行,那我们接下来就做个关于Cookie的实验,去验证一些东西。
因为这只是一个实验,所有这里笔者不会讲Cookie的使用和作用以及其他介绍。大致理一下,我们要验证的一些点如下:
- 单个域名下浏览器Cookie限制个数为多少?
- 浏览器Cookie单个Value值可以允许多大?
经过
建模
在开始实验之前,我们先建个模型,大致这个实验它要怎么展开,上图。

起初笔者是提供了一个手动挡的模型,你可以试着输入name和value,然后点击按钮Add Cookie,它就会把这条记录写到Cookie里面,为了便于对照,笔者又读取了cookie的信息同步了一份到网页上,看着直观点。由于我们要记录Cookie数,这里笔者简单粗暴地把它设置在网页可视内容的右上角,那个冒红的地方。再后来笔者想偷点懒,就实现了一个随机生成Cookie的手动挡模型Add Random Cookie。后续的所有实验结果也都是在这个基础上得出来的。
写好程序后,笔者首先在Chrome最新版浏览器测试了下。发现的规律是,当Cookie的个数达到180个后,再增加就会降到150个,就是说180是它的上限,到了以后它自动清掉了30个选手。

这里有个问题是,笔者当时也是直接随机了两次分别塞到name和value上面。通过观察,我们很难发现到达上限以后它删除的规律是怎么样的,是删除最前面的30个,还是后面的30个,还是随机的呢?
好,我们改一下,我们的肉眼对数字会敏感一些,那我们就把它的value全部换成数字去看看。

可以看到它是删除了最前面的30个cookie记录。
笔者在自己的手机里,通过打开小米内置浏览器的结果也是和这个一样的。
接下来我们测下在火狐浏览器的情况,笔者电脑上火狐浏览器的版本还是比较低的,没有升级到最新版,因为48.0.2这个版本它可以直接手动安装一些xpi插件,笔者就是在这个版本安装上了firebug和一起其他插件。

通过观察,我们可以看到,在火狐浏览器中,它的规律是当cookie的个数达到150个以后,它会删除最开始的Cookie,空出位置留个新添加的Cookie,它的上限是150个,后续再添加一个Cookie记录就删除最前面的cookie记录空出位置留给后面添加的。
到这里,笔者将相关的Cookie信息整理成文件,随机两个的结果是6KB左右,随机一个加阿拉伯的结果是3KB左右。看到这里,我们猜也能猜到了,最开始说的4KB限制,应该是指Cookie设置的一条记录。
当然,我们学理科是很严谨的,我们通过实验去看看结果吧。

笔者写了个测试程序,经过测试,在Chrome浏览器端的条件下发现,大约是4KB的样子。
结果
结论
因为浏览器的种类和版本都很多,所有在写结果之前,笔者会在前面加上“在一定条件下”。看着像句屁话,但它真的很有用,给你后面的话加了一条保险杠的效果。就好比文科作文写“XXX万岁”。
在一定条件下,基于Webkit内核的浏览器,Cookie呈现如下规律,当单个域名下Cookie数到达180个的时候,再次添加会删除最开始的30个Cookie里路,然后从150的基数依次往上增加直至180个后,浏览器会循环前面的操作。
在一定条件下,基于gecko内核的浏览器,Cookie呈现如下规律,当单个域名下Cookie数到达150个后,再次添加它会删除最前面的Cookie记录以腾出位置给添加的Cookie记录。
在一定条件下,Cookie单条记录的Value值允许大小近似于4KB。
最后
最后,附上实验相关地址:https://zhengjiangtao.cn/show/zj/cookie.html
有兴趣的同学也可以看下我打基础写的其他网页,它的项目地址是:https://zhengjiangtao.cn/show


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
分享一个关于Cookie做的实验结果的更多相关文章
- 分享一个我自己做的 Excel 万年历
下载链接在此. 纯 Excel 公式实现,带农历,可自定义节日.配色. 带有紧凑日历和记事日历两种日历,均可直接 Ctrl+P 打印,且打印时不带有顶部的控制栏.
- 分享一个自己做的SpringMVC的PPT
分享一个自己做的SpringMVC的PPT,由于比较忙只写了一些重要的部分
- 分享一个文件查找、替换制定的字符或数字之CS程序、附带源码
首先就上操作流程图: 图--登陆界面.登陆密码:alidoing.com 图--界面说明(一看就懂) 图--文件查找到再替换 图--文件替换成功 图--替换后的文件 代码开始: 登陆的代码就非常简单. ...
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- 分享一个漂亮的ASP.NET MVC界面框架
本文分享一个插件化的界面框架,该框架提供了用户.角色.权限管理功能,也提供了插件的管理和插件中心.下图是该界面框架的样式(全部源码和原理介绍下一篇分享,推荐越多,源码放的越早,呵呵). 要使用该界面框 ...
- [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"
[Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...
- 分享一个快速设置背景的js 自动获取背景图的长宽
我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...
- 分享一个强大的采集类,还可以模拟php多进程
做采集的时候,可以使用file_get_contents()去获取网页源代码,但是使用file_get_contents采集,速度慢,而且超时时间,不好控制.如果采集的页面不存在,需要等待的时间很长. ...
- 分享一个安卓中异步获取网络图片并自适应大小的第三方程序(来自github)
安卓中获取网络图片,生成缓存 用安卓手机,因为手机流量的限制,所以我们在做应用时,要尽量为用户考虑,尽量少耗点用户的流量,而在应用中网络图片的显示无疑是消耗流量最大的,所以我们可以采取压缩图片或者将图 ...
随机推荐
- Day17_购物车
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 注:实验 ...
- functools函数中的partial函数及wraps函数
''' partial引用函数,并增加形参 ''' import functools def show_arg(*args,**kwargs): print("args",args ...
- python基础day1&2
解决中文乱码问题 在开头加上 -*- encoding:utf-8 -*- if条件 if 条件: 结果#if elif else是单选,只走一条路 num = input('Please input ...
- Python os.stat() 方法
概述 os.stat() 方法用于在给定的路径上执行一个系统 stat 的调用.高佣联盟 www.cgewang.com 语法 stat()方法语法格式如下: os.stat(path) 参数 pat ...
- PHP str_rot13() 函数
实例 编码并解码字符串: <?php高佣联盟 www.cgewang.comecho str_rot13("Hello World");echo "<br&g ...
- JavaScript正则表达式相关方法
一.正则表达式方法 var str="abcdefabcdef"; (1)reg.test(str); 查看字符串是否有满足正则表达式的内容,并返回一个布尔值true/false ...
- luogu4443 coci 2017 Dajave
题目 给出一个长度为2^M的排列,元素分别是0, 1, 2, ... , 2^M -1. 选择其中某个非空连续子序列,然后允许交换这个排列中某两个不同的数,然后使得这个连续子序列的所有数的按位异或(b ...
- python之路第一节-pip的使用
第一次写博客,一边吃着旺仔冻痴一边学着python,爽~ 我之理解pip 首先,python封装好了大量的函数,这些函数存在各种各样的库中. 那么怎么去向我们可爱的pycharm等软件导入这些库呢,两 ...
- scala下划线的用法
1.作为“通配符”,类似Java中的*.如import scala.math._2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是 ...
- Docker技术入门与实战
Docker技术入门与实战 下载地址https://pan.baidu.com/s/1bAoRQQlvBa-PXy5lgIlxUg 扫码下面二维码关注公众号回复100011 获取分享码 本书目录结 ...