在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來應答。