对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中。
原文地址:https://www.cnblogs.com/BRSblackshoot/p/15129511.html
- 左手用R右手Python系列——百度地图API调用与地址解析/逆解析
- OpenCV实战:人脸关键点检测(FaceMark)
- Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)
- 模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板
- 洛谷P1311 选择客栈
- 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle
- R语言抓包实战——知乎live二级页面获取
- 左手用R右手Python系列——面向对象编程基础
- 线性同余同余方程组解法(excrt)
- #19. 计数(容斥原理)
- 左手用R右手Python系列——多进程/线程数据抓取与网页请求
- #15. 钻石
- P1328 生活大爆炸版石头剪刀布
- ASP.NET MVC 5 Authentication Breakdown
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于UVM的UART验证环境
- 潘石屹用Python解决100个问题 | 打印菱形
- Android:源码解析 Dialog的窗口机制
- Java|获取图片rgb值
- (数据科学学习手札93)利用geopandas与PostGIS进行交互
- 设计模式(三):旅行的角度理解抽象工厂模式
- 机器学习中的优化算法!
- 【进阶篇】Python+Go——带大家一起另寻途径提高计算性能
- 爬取豆瓣高分电影。
- 快速带你上手Hyperledger Fabric环境搭建+开发测试
- 尝鲜使用微众银行WeCross实现基于哈希时间锁定的跨链转账
- Flutter 富文本第三方库 rich_text_widget
- 程序员的数学:线性代数之可视化
- 基于七牛SDK构建的Vue单页图片管理应用
- [Electron]仿写一个课堂随机点名小项目