深入理解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的知识没说完,下节再说。