一:理解HTTP协议是一种无状态的协议
为什么说HTTP是一种无状态的协议呢?因为HTTP不会为了下一次的连接而维护本次连接所传输的信息。这是为了保证服务器的内存。同样的,也就是说HTTP协议没有在下一次传输之前得到本次传输的信息的能力。
- 无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
- HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
- 从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
- Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
二:理解Cookie和Session的区别
由于HTTP协议是无状态的协议,所以当服务端需要记录用户的状态时,就需要用某种机制来识具体的用户。Session和Cookie就是为解决这个问题而提出来的两个机制。
- Cookie
- Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一服务器,是在客户端保持状态的方案。(当你在访问某网站时需要你填写用户名和密码,然后服务器会在本地机器上面存储相关信息,当再次访问该网站时,会自动将信息帮你填写好,会减少一些步骤)
- Cookie的主要内容包括:名字,值,过期时间,路径和域。
- 当客户端请求服务器,服务器需要记录该用户的状态时,就会向客户端浏览器发送一个cookie。客户端浏览器会把cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器。服务器检查该cookie,以此来辨认用户的状态。服务器还可以根据需要修改cookie的内容。
- cookie也是实现session的一种方式。
- Session
- session是存在与服务器中的一种用来存放用户数据的机制(存放结构类似于散列表)。
- 浏览器第一次访问服务器时会创建一个session对象并返回一个SESSIONID=ID的值,并且会以key-value的形式创建一个Cookie对象(key为SSIONID,value为ID)的值,将这个Cookie写回浏览器,浏览器在第二次访问服务器的时候携带Cookie信息(SESSIONID=ID)的值
- 浏览器第一次发送请求时,服务器自动生成了一个session对象来标识这个这个用户的信息,并将其通过响应发送到浏览器。浏览器第二次发送请求会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的信息。
- session对象是用户第一次访问服务器的时候创建的,(服务器会把session存在内存中)此后,每当用户访问服务器,服务器都会更新维护session对象。
三:Cookie和Session的区别:
- cookie和session都是会话技术,cookie的数据存放在客户端,而session的数据存放在服务器端。
- cookie的安全性没有session高。(可以通过抓包等方式拦截本地文件,进行修改攻击)
- cookie有大小限制(与本地机器有关)而session的大小限制与服务器内存的大小有关。
- session是保存在服务器中的,存在一段时间可能会消失,过多的session也会增加服务器的压力。
(如果不全希望批评指点,也欢迎补充)
四:使用场景
- cookie:网页登录会出现不需要输入用户名密码的情况
- session:当你每次访问或者更新购物车信息时,总能展示出最新的购物车信息。