在REST应用程序中,每一个请求必须包含服务器须要理解的全部信息,而不是依赖于服务器记住先前的请求。web
在服务器上存储会话状态违反了REST体系结构的无状态约束。所以,会话状态必须彻底由客户端处理。服务器
传统web应用程序使用远程会话。在这种方法中,应用状态彻底保存在服务器上。cookie
远程会话样式是客户机-服务器的一个变体,它试图最小化客户端组件的复杂性,或者最大限度地重用客户机组件,而不是服务器组件。每一个客户端在服务器上启动一个会话,而后在服务器上调用一系列服务,最后退出会话。应用程序状态彻底保留在服务器上。...session
虽然这种方法带来了一些优势,但它下降了服务器的可伸缩性:负载均衡
远程会话样式的优势是更容易集中维护服务器上的接口,在扩展功能时减小对已部署客户端中的不一致性的关注,若是在服务器上使用扩展的会话上下文,则提升效率。缺点是,因为存储的应用程序状态,它下降了服务器的可伸缩性,下降了交互的可见性,由于监视器必须知道服务器的完整状态。分布式
REST体系结构样式定义在一组约束的顶部,其中包括服务器的无国籍状态。根据菲尔丁的说法,其他的无状态约束定义以下:spa
客户端到服务器的每一个请求都必须包含理解请求所需的全部信息,而且不能利用服务器上存储的任何上下文。所以,会话状态彻底保留在客户端上。对象
这个约束致使了能见度,可靠性,和可伸缩性:接口
可见性获得了改善,由于监控系统没必要只看单个请求数据,就能够肯定请求的所有性质。可靠性的提升是由于它简化了从部分故障中恢复的任务。可伸缩性获得了改善,由于不须要在请求之间存储状态,可让服务器组件快速释放资源,并进一步简化实现,由于服务器没必要管理跨请求的资源使用状况。内存
若是客户端请求须要身份验证的受保护资源,则每一个请求必须包含全部必要的数据必须通过适当的认证/受权。
HTTP身份验证被认为是无状态的:验证请求所需的全部信息必须在请求中提供,而不是依赖于服务器记住先前的请求。
基于状态的Web服务
在基于状态的Web服务中,Client与Server交互的信息(如:用户登陆状态)会保存在Server的Session中。再这样的前提下,Client中的用户请求只能被保存有此用户相关状态信息的服务器所接受和理解,这也就意味着在基于状态的Web系统中的Server没法对用户请求进行负载均衡等自由的调度(一个Client请求只能由一个指定的Server处理)。同时这也会致使另一个容错性的问题,若是指定的Server在Client的用户发出请求的过程当中宕机,那么此用户最近的全部交互操做将没法被转移至别的Server上,即此请求将无效化。
基于无状态的Web服务
在无状态的Web服务中,每个Web请求都必须是独立的,请求之间是彻底分离的。Server没有保存Client的状态信息,因此Client发送的请求必须包含有可以让服务器理解请求的所有信息,包括本身的状态信息。使得一个Client的Web请求可以被任何可用的Server应答,从而将Web系统扩展到大量的Client中。
总结二者的区别
由于无状态原则的特性,让RESTful在分布式系统中获得了普遍的应用,它改善了分布式系统的可见性、可靠性以及可伸缩性,同时有效的下降了Client与Server之间的交互延迟。无状态的请求有利于实现负载均衡,在分布式web系统下,有多个可的Server,每一个Server均可以处理Client发送的请求。有状态的请求的状态信息只保存在第一次接收请求的Server上,因此后来同一个Client的请求都只能由这台Server来处理,Server没法自由调度请求。无状态请求则彻底没有这个限制。其次,无状态请求有较强的容错性和可伸缩性。若是一台服务器宕机,无状态请求能够透明地交由另外一台可用Server来处理,而有状态的请求则会由于存储请求状态信息的Server宕机而承担状态丢失的风险。Restful风格的无状态约束要求Server不保存请求状态,若是确实须要维持用户状态,也应由Client负责。
例如:
使用Cookies经过客户端保持登录状态:
在REST中,每个对象都是经过URL来表示,对象用户负责将状态信息打包进每一条信息内,保证对象的处理老是无状态的。在HTTP服务器中,服务器没有保存客户端的状态信息,客户端必须每次都带上本身的状态去请求服务器。客户端以URL形式提交的请求包含了cookies等带状态的数据,这些数据彻底指定了所需的登陆信息,而不须要其余请求的上下文或内存。
传递User credentials是Restful,而传递SessionID是Un-Restful的,由于session信息保存在服务器端。
无状态请求:Server不保存任何请求状态信息,Client的每个请求都具备User credentials等所须要的所有信息,因此能被任意可用的Server应答。
有状态请求:Server保存了Client的请求状态,Server会经过Client传递的SessionID在Server中的Session做用域找到以前交互的信息,并以此来实现应答。因此Client只能由某一个Server来应答。