深入理解Session与Cookie(一)
Session,Cookie简介:
Session和Cookie的作用都是为了保持用户与后端服务器的交互状态,但是各自都有缺陷:
Cookie:
随着Cookie的个数的增多和访问量的增加,它占用的网络带宽很大,假设一个Cookie占用100字节,如果一天的PV有几亿,那么它得占多少带宽?
Session:
Session的致命弱点在于不容易在多台服务器之间共享,这也限制了Session的使用。
理解Cookie:
当一个用户通过HTTP访问一个服务器时,这个服务器将一些Key/Value的键值对返回客户端浏览器,当这个用户再次访问服务器时,数据又被完整的带回服务器。
当前Cookie有两个版本:Version0和1,响应头设置的标识也不同:Set-Cookie,Set-Cookie2,属性也有些不同(Servlet3.0规范支持Version1)。
Cookie如何工作:
@RequestMapping(value = "/testCookie")
public Object testCookie(HttpServletRequest request, HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
String userName = getCookie(cookies, "userName");
String userAge = getCookie(cookies, "userAge");
if (userName == null) {
response.addCookie(new Cookie("userName", "zhangsan"));
}
if (userAge == null) {
response.addCookie(new Cookie("userAge", "18"));
}
return response.getHeaders("Set-Cookie");
} private String getCookie(Cookie[] cookies, String key) {
if (cookies != null) {
for (Cookie cookie : cookies) {
if (key.equals(cookie.getName())) {
return cookie.getValue();
}
}
}
return null;
}
访问后,得到如下输出,说明每次创建Cookie时都会创建一个Header。

具体是怎么实现的,根据源码得知,真正构建Cookie是在Tomcat的catalina.jar中的Response类中完成的,该类实现了HttpServletResponse接口。

generateCookieString中由CookieProcessor.generateHeader()方法来进行Cookie到String的转换。

接着执行addHeader方法,addHeader()里调用了MimeHeaders.addValue(name)方法,由MessageBytes.setString(value)设置值,待到真正响应时由Http11Processor.prepareResponse()方法来进行预处理,按顺序的写入字节流中返回。


好了,整个Cookie的创建到响应的过程就到此结束了,有兴趣的朋友们可以自行研究一波源码。
Cookie的限制:
Cookie是HTTP头中的一个字段,虽然Http本身对这个字段没有多少限制,但是Cookie最终是存在浏览器中的,所以不同的浏览器对Cookie的存储都有一些限制。
| 浏览器版本 | Cookie的数量限制(每个域名) | Cookie的总大小限制 |
| IE6 | 20 | 4095字节 |
| IE7 | 50 | 4095字节 |
| IE8 | 50 | 4095字节 |
| IE9 | 50 | 4095字节 |
| Chrome | 50 | 大于80000 |
| FireFox | 50 | 4097个字节 |
所以说,当如果想在IE上使用Cookie来存储很长一段信息的时候就得注意了,超出长度的部分会被截断,当然一般只有初创公司会这么干^_^(我就被坑过一次)。
还有一些Cookie的知识没说完,下节再说。
深入理解Session与Cookie(一)的更多相关文章
- 理解Session与Cookie
写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益. === ...
- 转!!深入理解 Session 与 Cookie
摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...
- 深入理解 Session 与 Cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
- 【转】深入理解 Session 与 Cookie
Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简单又复 ...
- [web]深入理解Session和Cookie
一.理解Cookie 由于http是一种无状态的协议,当用户的一次访问结束后,后端的服务器就无法知道下一次来访问的请求是不是上一次的用户了.那么Cookie的作用就是用户通过http访问一个服务器时, ...
- 理解session和cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
- 第10章 深入理解Session与Cookie
需要很多Cookie时,考虑HTTP对Cookie数量和大小的限制. 几百或更多台服务器的时候,如何解决Session在多态服务器之间共享的问题. 还有一些安全问题,如Cookie被盗,Cookie伪 ...
- 深入理解Session和Cookie机制
具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而 ...
- 第十章 深入理解Session与Cookie
理解Cookie 理解Session Cookie安全问题 分布式Session框架 Cookie压缩 表单重复提交问题 多终端Session统一
随机推荐
- hiredis的安装
Hiredis客户端下载地址:https://github.com/antirez/hiredis/zipball/master Hiredis安装步骤: tar zxvf antirez-hired ...
- Android shape使用详解
在android开发过程中,shape是比较常用的,用于设定控件的形状,可以在selector,layout等里面使用,有6个子标签,各属性说明如下: <?xml version="1 ...
- Hybrid APP 架构设计思路
关于Hybrid模式开发app的好处,网络上已有很多文章阐述了,这里不展开. 本文将从以下几个方面阐述Hybrid app架构设计的一些经验和思考. 原文及讨论请到 github issue 通讯 作 ...
- org.hibernate.TransientObjectException:The given object has a null identifier
1.错误描述 org.hibernate.TransientObjectException:The given object has a null identifier:com.you.model.U ...
- Windows gsl runtime error的解决方案
经过两天多的奋战,终于把GLAD源码集成进来了. 在编译.链接都正确,程序开始跑之后,又出了一个让人很无奈的runtime error, 就在 /* Initialize minimizer */ T ...
- Coins HDU - 2844
Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened p ...
- Python机器学习 (Python Machine Learning 中文版 PDF)
Python机器学习介绍(Python Machine Learning 中文版) 机器学习,如今最令人振奋的计算机领域之一.看看那些大公司,Google.Facebook.Apple.Amazon早 ...
- Luogu1121:环状最大两段子段和
题面 传送门 Sol 两种情况 第一种就是类似\(***000***000***(0表示选)\),这个可以DP 设\(h[0/1/2/3][i]\)表示到第\(i\)位的状态: \(0\):表示还没选 ...
- (jzoj snow的追寻)线段树维护树的直径
jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...
- linux升级python3.6相关命令
sudo apt-get install python3.6 sudo update-alternatives --install /usr/bin/python python /usr/bin/py ...