session和cookie是用于记录客户端信息的技术,都是用来跟踪浏览器用户身份的会话方式。
cookie (数据存储在客户端)自带证明自己身份信息的标记 (跨页面间变量传递 :自己携带的一些信息从后台绕一下 请求转发 缓存 到别的页面)
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?
就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证,这样服务器就能从通行证上确认客户身份了。
浏览器第一次发送请求到服务器端
服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
浏览器端再次访问服务器端时会携带服务器端创建的Cookie
服务器端通过Cookie中携带的数据区分不同的用户
session(数据存储在服务端)把服务器端的文件信息存储在硬盘上或是内存中。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
浏览器端第一次发送请求到服务器端,服务器端创建一个Session。同时会创建一个特殊的Cookie,然后将该Cookie发送至浏览器端。
特殊的cookie:name为 JSESSIONID 的固定值,value 为 session对象的ID
浏览器端发送第N(N>1)次请求到服务器端,访问服务器端时携带 name 为 JSESSIONID 的 Cookie对象
服务器端根据 name 为 JSESSIONID 的 Cookie 对象的 value (即sessionId),去查询 Session对象,从而区分不同用户。
通过原理可以知道:
Session的使用要求用户浏览器必须支持Cookie, 如果浏览器不支持使用Cookie,或者设置为禁用Cookie,那么将不能使用Session。
1. 数据保存的位置不同
在上面介绍的时候也提到过,cookie是保存在客户端(浏览器或者本地),session保存在服务端。
2. 对服务器造成的压力不同
由于两者数据存储位置的不同,cookie使用起来更加灵活方便。当访问增多时,每个用户都会产生一个Session,占用大量内存,比较耗费服务器的性能。
3. 存储大小不同
单个cookie保存的数据一般小于4kb,并且一般一个站点最多保存20个cookie;而对于session来说没有限制,但是由于session保存在服务器端,session不宜过大,会影响服务器端的性能。
4. 存储内容不同
cookie只能存储String类型字符串对象,而session存储结构类似于hashtable的结构,可以存放任何类型。
5. 安全程度不同
由于cookie保存在客户端,有可能会被人篡改或窃取,它存在一定的安全隐患(一般情况下,浏览器会对cookie进行一些限制,提高cookie的安全性),session是保存在服务器端的所以安全性更高一些,所以我们可以把一些重要信息用session来存储。
6. 有效期不同
cookie可以设置保存时间,会在有效期内一直保存;而session是会话级别的,会话结束,session也相应被清除
7. 跨域支持上的不同
Cookie支持跨域名访问,而Session则不会支持跨域名访问,Session仅在他所在的域名内有效。