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(一)的更多相关文章

  1. 理解Session与Cookie

    写在前面的话:Session和Cookie是非常有意思的两个概念,对于两者的管理可以处理的很复杂,但是无论如何,理解Session和Cookie的基本概念和发明初衷,对于问题的解决,大有裨益. === ...

  2. 转!!深入理解 Session 与 Cookie

    摘要 Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简 ...

  3. 深入理解 Session 与 Cookie

    Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...

  4. 【转】深入理解 Session 与 Cookie

    Session 与 Cookie 不管是对 Java Web 的初学者还是熟练使用者来说都是一个令人头疼的问题.在初入职场时恐怕很多程序员在面试的时候都被问到过这个问题.其实这个问题回答起来既简单又复 ...

  5. [web]深入理解Session和Cookie

    一.理解Cookie 由于http是一种无状态的协议,当用户的一次访问结束后,后端的服务器就无法知道下一次来访问的请求是不是上一次的用户了.那么Cookie的作用就是用户通过http访问一个服务器时, ...

  6. 理解session和cookie

    Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...

  7. 第10章 深入理解Session与Cookie

    需要很多Cookie时,考虑HTTP对Cookie数量和大小的限制. 几百或更多台服务器的时候,如何解决Session在多态服务器之间共享的问题. 还有一些安全问题,如Cookie被盗,Cookie伪 ...

  8. 深入理解Session和Cookie机制

    具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而 ...

  9. 第十章 深入理解Session与Cookie

    理解Cookie 理解Session Cookie安全问题 分布式Session框架 Cookie压缩 表单重复提交问题 多终端Session统一

随机推荐

  1. Typescript 基础应用

    什么是 TypeScript TypeScript 是微软开发的 JavaScript 的超集,TypeScript兼容JavaScript,可以载入JavaScript代码然后运行.TypeScri ...

  2. 碎片︱R语言与深度学习

    笔者:受alphago影响,想看看深度学习,但是其在R语言中的应用包可谓少之又少,更多的是在matlab和python中或者是调用.整理一下目前我看到的R语言的材料: ---------------- ...

  3. Vue指令总结---小白同学必看

    今天主要复习一下我们最熟悉vue指令,想要代码撸得快,就要多看书,多看看官方的文档和学习指令,学习编程是一个非常享受的过程,尤其是你不断地去解决问题,获得一项技能,实现薪水的上涨.进行Vue的指令烹饪 ...

  4. hdu5893 List wants to travel

    裸的树链剖分加线段树区间修改 区间合并时需要多注意一点 当时写的很慢 理解不深刻 #include<bits/stdc++.h> using namespace std; const in ...

  5. [CF940F]Machine Learning

    codeforces 一句话题意 求区间数字出现次数的mex,带修改 sol 带修膜队不解释 带修膜队的排序! struct query{ int id,l,r,t; bool operator &l ...

  6. 【UOJ207】共价大爷游长沙(Link-Cut Tree,随机化)

    [UOJ207]共价大爷游长沙(Link-Cut Tree,随机化) 题面 UOJ 题解 这题太神了 \(\%\%\%myy\) 看到动态的维护边很容易的想到了\(LCT\) 然后能否堵住一条路 我们 ...

  7. 【BZOJ4827】【HNOI2017】礼物(FFT)

    [BZOJ4827][HNOI2017]礼物(FFT) 题面 Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每 ...

  8. [LNOI2014] LCA

    题目描述: 网址:http://www.lydsy.com/JudgeOnline/problem.php?id=3626 大意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0). 一个点的 ...

  9. [SCOI2010]传送带

    在两个传送带上分别三分两个点计算 三分套三分 # include <bits/stdc++.h> # define IL inline # define RG register # def ...

  10. iOS开发--XMPPFramework--环境的配置(一)

    一.XMPPFramework概述 XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具, ...