Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力
一、Cookie
解决问题:
因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这点,就需要使用到Cookie了,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
Cookie(复数形态:Cookies),是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。Cookie是由服务端生成的,发送给客户端(通常是浏览器)的。
Cookie总是保存在客户端
- 按存在时间可以分为会话cookie和持久化cookie;
按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie:
(1)、内存Cookie:保存于浏览器,在内存中,用户推出浏览器后就被删除,也叫会话cookie;
(2)、硬盘Cookie:保存于硬盘,有一个过期时间(maxAge),除非用户手工清理或到了过期时间才会被删除。
原理机制:
- 创建cookie:当用户第一次浏览某个使用cookie的网站时,服务器就会为该用户生成一个唯一的识别码(cookie_id),创建一个cookie对象,放入HTTP响应报文中的Set-Cookie中发送给客户端;
- 存储cookie:浏览器收到该响应报文之后,生成相应的Cookie,保存在客户端,记录用户当前信息;
- 发送cookie:当用户再次访问该网站时,浏览器首先检查存储的cookie,如果存在该网站的cookie,则把cookie放入HTTP请求报文中的Cookie中去发送给服务端;
- 读取cookie:服务器收到客户端发来的带有cookie的HTTP请求报文之后,从报文头获取该用户的cookie,从而获取相应的信息;
- 手绘过程一下很简单:
不足之处:
1、Cookie附加在每个HTTP请求中,无形当中增加了流量;
2、HTTP请求中的Cookie是明文传递的,所以存在安全性问题(可以使用HTTPS);
3、Cookie大小限制在4KB左右,对于复杂的存储需求来说是不够用的。
应用场景:
1、记住密码,自动登录;
2、购物车加购功能;
3、记录用户浏览数据,进行商品(广告)推荐。
二、Session
解决问题:
针对Cookie的一些不足加以改进
原理机制:
- 创建Session:当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个Session,创建Session的时候服务器首先检查浏览器发来的请求里是否包含一个session id(JSESSIONID),如果包含,说明已经为这个用户创建过Session,服务器就在内存中将这个Session查找出来,如果不包含,则为该客户端创建一个Session并生成一个与此相关联的SessionId;
- 使用Session:保存SessionId的方式有多种,可以采用Cookie;如果Cookie被禁用,可以采用URL重写的方式,将SessionId直接附加在URL路径后边;还有一种技术叫做表单隐藏字段,就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交的时候将SessionId传回服务器;
不足之处:
增加了服务器的负载
应用场景:
1、Session验证,比如用户登录验证;
2、购物车功能;
两者区别:
- 数据存放位置不同:Cookie存放在客户端,Session保存在服务端;
- 存取方式的不同:Cookie中只能直接存取ASCII字符串,对于Unicode字符或者二进制数据,需要进行编码,对于Java对象这些比较复杂的信息,存取就比较困难;而Session中可以存任何类型数据,可以看作一个Java容器类;
- 安全性不同:Cookie存储在浏览器中,对客户端是可见的,客户端的程序有可能会窥探Cookie中的内容;而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险;
- 有效期不同:Cookie可以设置过期时间maxAge,默认是一次会话时间,而Session的JSESSIONID的过期时间为一次会话时间;
- 服务器压力不同:Session是保存在服务器端的,并发访问的用户十分多时候,会耗费大量的内存;而Cookie保存在客户端,不占用服务端资源;
- 跨域支持不同:Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。