无状态指的是任意一个Web请求必须完全与其他请求隔离,当请求端提出请求时,请求本身包含了相应端为相应这一请求所需的全部信息。
1. 被调用者不保存参数,因为无需考虑参数逻辑
由使用者来保存状态,进行状态逻辑设计
http是无状态设计的,一些SDK的设计也可以是无状态的。
2. 而一些需求是需要有交互的,需要状态的
如:
a. 表单(Form);
b. 客户端的脚本处理、DOM处理等功能;
c. 服务器的CGI(Common Gateway Interface)以处理包含表单提交在内的动态请求。
交互是需要承前启后的,一个实际例子是,简单的购物车程序也要知道用户到底在之前选择了什么商品。
这种客户端与服务器进行动态交互的Web应用程序,都需要状态。
解决方法:
两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
Cookie是客户端保存状态的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。Cookie一般是放在http header中的。比如user id, user name, user的身份信息,user school, user company等.当然服务端也会保留这些Cookie信息的,并且可以给这些Cookie添加额外的属性,如过期时间等。
Session是服务器来保持状态的解决方案。客户端浏览器与服务器之间一系列交互的动作称为一个Session,其不仅包含Session持续的时间,还包括操作,还有服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。服务器收到客户端请求时,会为该Session生成唯一的Session id,在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session
id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。这样用户先前的状态或请求也就得以保持了。
而UserAgent是跟device相关的,软硬件的信息。与系统相关,与每个url都相关,但与user无关。是让服务器拿到这些信息,更好的适配这些请求。如版本信息、时区、浏览器的种类等等。