HTTP Cookie规范

一、Cookie原理

所有数据在网络上传输,最终都可以理解为字符串的传输。不要跟我扯到二进制,还原主义并没有将问题简单化,特别是在计算机世界里,使用还原主义,一切都还原成二进制流,这根本没有意义。

这里我们先还原到文件这个程度,所有文件都是有格式的,比如视频的avi格式,图片的jpg格式,文档的doc格式,表格的xls格式。何为格式,就是表示文件的规范,格式规定了文件的文件头,文件体,文件尾等,让文件的生成和读取可以程序化,可以在网络上传输。

这里HTTP协议也是一样的道理,HTTP是超文本传输协议,可以传输各种文件,所以发送方和接收方需要约定好规则,在每一次交互时按照规则去组装和读取接收到的文件。那么在HTTP中传输的cookie是怎么回事呢?

整个HTTP请求数据其实就是一段按格式排列的文本,我们在使用的时候,很多工具包提供了方法,让我们以对象的方式来操作HTTP请求数据。以javax.servlet.http.Cookie为例,就是Java后端操作Cookie的方式,后端设置Cookie的原理是在HTTP请求的header里面设置名为Set-Cookie,值为cookie约定格式的请求头。

在实际操作时,会有一些特定的场景,比如最近比较新的Cookie属性如:SameSite=None; Secure,在Servlet API里面就没有,需要你自己手动操作了,如果不懂Cookie就是header里面一个属性键值,是无法自行完成这个操作的。此时我们可能有多个Cookie操作,就需如何操作多个Set-Cookie。对于Servlet API而言,如下即可:

response.addHeader("Set-Cookie","a1=a1");
response.addHeader("Set-Cookie","a2=b2");

这样并不会覆盖,会生成多个Set-Cookie给到前端,通过这种方式就能设置Cookie的SameSite属性了。

二、Cookie的生命周期

Servlet API中意义使用如下:

setMaxAge(60*60) 设置值大于0(seconds), 将cookie存储于本地磁盘, 过期后删除
setMaxAge(-1) 设置值小于0, cookie不会保存于本地,会话结束后删除
setMaxAge(0) 设置值等于0, 立即删除cookie

三、Cookie的域

原理的东西很简单,主要说明的是实际使用中遇到的问题

1、要不要加点是个规范执行的问题

我们看到浏览器中现实domain或是Servlet API中setDomain()参数要不要加点的问题,不好意思,这个还真说不准,需要以实际为准,因为不太确定API会不会自作聪明,目前看来,Tomcat8.5+的版本中,如果加点是会报错的。因为8.0事后就直接到了8.5,从8.5开始就默认使用了org.apache.tomcat.util.http.Rfc6265CookieProcessor,而以前的版本中一直使用的是org.apache.tomcat.util.http.LegacyCookieProcessor,下面就来看看这两种策略到底有哪些不一样?

1、必须是1-9、a-z、A-Z、. 、- (注意是-不是_)这几个字符组成
2、必须是数字或字母开头 (所以以前的cookie的设置为.i5a6.com 的机制要改为 i5a6.com 即可)
3、必须是数字或字母结尾

读取时也会有新的规则,对特殊字符处理会出现非预期结果。

2、同一个Cookie名设置了多级域名,发送优先级如何?

当不设置domain时,默认使用请求使用的domain。不设置path时,默认使用请求使用的path。

当设置的domain和域名和请求host完全匹配不上,浏览器会直接丢弃。

当一个Cookie值的domain分别为b.com和a.b.com,那么,浏览器行为和服务端读取行为是什么样的?假如请求的host是a.b.com,答案是,都会带上,那么此时服务端获取Cookie时,根据name来取的话,会有多个,需要自行判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值