一开始,对无状态这个定义非常模糊,仔细查阅网上资料,算是对该定义有了一定的了解,这里做下笔记,用作总结。
在对HTTP协议的介绍中,明确的说明HTTP协议是无状态协议。
“无状态”是指协议对于事务的处理没有记忆能力。意味着,协议本身不会在处理事务的过程中针对【之前】的信息进行存储,如果在处理当前步骤的时候需要【之前】的信息,则必需重传。
按照上面的说法,我们可以意识到,这样的做法在需要连续操作的时候,就要重新传递【之前】的信息,会导致每次连接传递的数据量增大,传递速度下降,服务器响应时间延长。反之,如果不需要连续操作,服务器不需要【之前】的信息,数据量小,传递速度快,服务器响应速度快。
在客户端可以与服务器进行动态交互的Web程序出现以后,用户与服务的交互是承前启后、没有间断的连续操作,更多的服务开始在乎用户在【之前】做了什么。这时HTTP无状态的特性,使这些程序的实现变的非常困难。
有鉴于此,为了在一个无状态的连接协议上存储客户端与服务器之间的交互状态,出现了两种用于保持HTTP连接状态的技术,一个是Cookie,而另一个则是Session。
Cookie是通过客户端保持状态的解决方案。Cookie从定义上讲,是由服务器发给客户端的信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些信息。
打个比方,用户通过浏览器访问一个支持Cookie的网站时,用户会提供用户名在内的个人信息并提交至服务器;服务器在向客户端回传响应的超文本信息时,也会将这些个人信息放进HTTP响应头中,一同回传至客户端。当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置。然后,客户端在向服务器发送请求的时候,都会把相应的Cookie放在Http请求头中,发送到服务器。
与Cookie相对的一个解决方案是Session,它是通过服务器来保持状态的。由于Session这个词汇包含的语义很多,因此需要在这里明确一下 Session的含义。首先,我们通常都会把Session翻译成会话,因此我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个 Session。从这个语义出发,我们会提到Session持续的时间,会提到在Session过程中进行了什么操作等等;其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。从这个语义出发,我们则会提到往Session中存放什么内容,如何根据键值从 Session中获取匹配的内容等。
不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。
综上所述,HTTP协议本身是无状态的,但是,我们可以使用Cookie和session存储客户端与服务器的交互状态。
该文是学习总结,如有不足之处,烦请指正。