HTTP 状态管理: cookie 与 session
HTTP最大的缺点:无状态(记性不太好)
无状态,每个请求都是独立的
导致后续请求需要重传,且需求累增
因此,HTTP的状态管理(会话机制)用来弥补这一缺陷
session与cookie叫做会话跟踪机制
cookie
一小段文本信息
- 服务器需要记录用户状态,就向客户端颁发一个Cookie
- 客户端浏览器会把Cookie保存起来,当浏览器再请求该网站时,浏览器把请求的网址连同cookie一同发送给服务器,服务器检查该cookie来辨认用户状态
服务端通过setCookie设置响应头
session
-
session是另一种记录客户状态的机制,保存在服务器上。客户端浏览器访问服务器的时候,服务器以某种形式把客户端信息存储在服务器上,也增加了一些服务端的存储压力(我记得有的用数据库存了session)
-
客户端浏览器再次访问时,只需要从该session中查找该客户的状态就可以了
cookie机制是通过检查客户身上的通行证来确认客户身份
session机制就是通过检查服务器身上的客户明细表来检查客户身份
首次访问生成sessionId和Session,服务器保存到映射区
返回给客户端SessionId,保存到cookie保存区
后续访问,cookie保存区携带SessionID,服务器据此查找对应的session,进行其他操作
然后返回处理结果
如果没找到session,或者客户端发来的cookie没有sessionID,那么生成一个新的cookie/session通过cookie把sessionID存储到客户端
90%以上的网站都是这样支持的
但是cookie可以被认为篡改,因此还有另外一种保存SessionID的方法
- 这种方法就是URL重写,把查询sessionID当做一个参数写在url上
- 隐藏表单,提交的时候传给服务器
session超时失效
cookie理论上可以永久存储
- 为了防止内存溢出,服务器把很久没活跃的session删除,即是session的超时失效
- 程序调用HttpSession.invalidate
- 服务器被异常中止
http保存状态的两种机制
- 存放位置不同
session存储在服务器,cookie存储在客户端 - 安全性不同,隐私策略不同
cookie存储在客户端,容易被篡改,存在敏感信息泄露的风险。或者把cookie信息加密,在服务器解密,保证cookie信息只有读的懂
session存储在服务器,安全性比较好 - 有效期上的不同
一、设置cookie有效时间,可以设置很久很久过期,在浏览器保存很长时间
二、服务端会定时清除session,防止对服务器造成过多压力。session依赖于cookie中的sessionID,而cookie的sessionID默认是-1,只要关闭浏览器,这个sessionID就失效了 - 对服务器造成的压力不同
session保存在服务器端,并发量大的时候服务器压力大
cookie保存在客户端,压力不大