提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
因为HTTP协议是无状态的,每次同一浏览器向服务器请求时,服务器都会将该请求视为新的请求,所以需要使用会话跟踪技术去实现同一会话内数据共享,比如cookie和session。
一、存储位置
- cookie的数据信息存放在客户端浏览器中。
- session的数据信息存放在服务器上。
二、存储容量
- 单个cookie保存的数据<=4KB,一个站点一般保存20~50个Cookie(不同浏览器不一样,Sarafi和Chrome对每个域的的Cookie没有严格限制)。
- 对于session来说并没有上限,受限于服务器内存。
三、存储方式
- cookie只能存储字符串数据。
- session可以存储任何类型的数据。
四、隐私策略
- cookie对客户端是可见的,每次请求敏感信息都需要携带在请求头中在http中传输,http是明文传输容易被攻击劫持。
- session存储在服务器上,不存在敏感信息泄漏风险(JSESSION是以cookie的形式存储在浏览器上,请求时携带在请求头中以http明文传输被截获也没什么影响,因为敏感数据是在服务器上)。
五、拓展
5.1 实现方式不同
- cookie基于HTTP协议实现的。浏览器向服务器发送请求之后,服务器会创建cookie对象并且把数据设置在响应头中返回给浏览器,浏览器之后的请求都会在请求头中带上cookie数据。
- session基于cookie实现的。浏览器想服务器发送请求之后,服务器创建session对象,session里面的数据会存放在服务器中,并且把JSESSION(每个session的标识id)以cookie的方式设置在响应头中返回给浏览器,浏览器把这个JSESSION存储在浏览器内存中,浏览器之后的请求都会在请求头上携带这个JSESSION,服务器才会根据这个session id 去找存储在服务器上的数据。
5.2 有效期
- cookie默认存活时间是浏览器关闭时销毁(setMaxAge为负数时,默认为setMaxAge(-1)),但是可以通过setMaxAge(单位:秒)持久化存储在电脑硬盘,到期自动删除。
- session的默认存活是30分钟,可以在web.xml中配置session-config的seesion-timeout属性(单位为分钟),也可以调用session.invalidate()方法立即销毁。session的存活时间还与存储在浏览器的JSESSION有关,如果JESSION存活时间为浏览器关闭就销毁,那么即使session的数据还存在服务器,但是浏览器再次请求服务器没有这个标识id也是找不到数据。
5.3 服务器压力
- cookie因为存储在客户端,不占用服务器资源,对于并发用户多的网站,cookie是很好的选择。
- session是存储在服务端,每个用户都会有一个对应的session。如果并发用户十分多,就会消耗大量的内存。