对cookie的一些研究

1.关于cookie对象的创建

cookie在实例化时只有一个有参构造函数,cookie没有set函数,只能通过这个有参构造进行键值对的设置

在将key和value存入cookie对象之前,会先进行验证:

如果之前有同key的cookie,会进行一个覆盖。

如果key输入不合法,例如为空则报异常

2.request.getCookies();的实现原理

每个页面除了可能存在的由程序员设置的cookie对象外,还有一个必定存在的页面自带的cookie——JSESSIONID,由服务器自动赋予浏览器。

如果我们使用request.getCookies();获取到页面的cookies对象数组,然后循环打印每一个cookies

那么我们会获取到如下的cookies

多次刷新下,每个cookie存的键值对的值不会变化,但是cookies本身会发生改变,这说明每次request.getCookies();返回的cookie对象都不一样,这就涉及到request.getCookies();方法的底层实现原理

整个方法的底层实现模拟如图,说明如下:

①String cookieString = request.getHeader("Cookie");

②String[] cookies = cookieString.split("; ");

③String[] cookieStr = s.split("=");

第一个方法是从请求头中获取到cookie属性的所有值,如图:

这里面包含页面的所有cookie,每个cookie用分号隔开,配合第二个方法进行字符串分割,就可以得到一个cookie键值对的数组,如注释那般,每个索引对应一个cookie键值对

进入循环后再配合第三个方法切分每个键值对,获得单独的key和value,再new一个cookie对象并存入值,然后把new的对象存入一个对象数组,循环完毕后把对象数组输出。

最终输出的cookies和直接使用request.getCookies();获得的cookie对象数组一样

这里面的关键点就是new对象 这就是为什么每次刷新时getCookies()返回的cookie地址(直接toString输出的字符串)都不一样的原因

3.cookie在浏览器和服务器之间传递的顺序

页面最开始加载后只有服务器给页面的一个储存ID的cookie

当我们执行了servlet中的方法——①创建cookie②发送cookie给页面  之后 页面就存在两种cookie request和response的

最后 刷新页面后,页面就只存在request cookie 用于浏览器传给服务器

当浏览器向服务器发送请求之后,服务器使用response.addCookie()添加cookie到浏览器上,此时cookie对象存储在浏览器上的response cookies中,当浏览器下一次发送其他请求时,在response cookie中的cookie会封装到消息头中,跟随整个请求头从浏览器传输到服务器上。这次请求完成之后,在浏览器上存储的cookie转移到request cookie中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值