不管是web應用仍是原生app應用,只要涉及網絡鏈接,基本就離不開登陸註冊,咱們註冊完成後登陸,這個狀態就被保持下來了,咱們下次打開app,應用就已經處於登陸狀態了,不須要咱們重複登陸,很是人性化,感受服務器好像會「記得」咱們每個人同樣,「記得」你來過,就再也不要求你登陸了。但其實計算機在這方面是很傻的,他不是自發「記得」咱們的,這篇文章就來聊聊登陸狀態的保持是怎麼實現的。
要弄明白下面說的東西,就得先了解一下HTTP協議,繁瑣的概念就很少贅述了,這裏主要注意一點,_HTTP協議是無狀態的_ ,什麼叫無狀態?咱們從一個故事講起:web
你去一家水果店買水果,你看到他們的桃子很鮮美,因而你大讚了老闆的桃子後並買了一斤。你回家嚐了桃子後以爲很是好吃,你決定次日繼續購買。當你次日開開心心的過來找老闆,跟他說「你家的水果然的很好吃,再來一斤我昨天買的那個水果」,可是發現老闆並不知道你昨天買過什麼,因而你很是生氣,跟老闆說「我昨天還誇了好久你的水果,你怎麼就不記得了?」一頓理論後你發現老闆始終不記得你昨天干過什麼事,最後你只好跟老闆代表要買一斤桃子,交易後灰溜溜地離開。
這個故事中的老闆就是無狀態的,對他來講,他只知道某我的要買什麼東西,給了多少錢,要買什麼水果,要找多少錢,對於過程當中的其它信息如是「誰」來買,他不會記得,他只會針對買賣自己進行處理。數據庫
無狀態就意味着每一個請求之間的不會直接地相互影響,對於每一個請求,一樣的請求參數就會獲得一樣的結果。服務器
最初的需求是請求HTML界面顯示出靜態網站,並不如如今那麼複雜豐富,用戶A點擊某個網址瀏覽到的頁面和用戶B點擊一樣網址瀏覽到的頁面是徹底如出一轍的,也就是服務器並不會對每一個不一樣的人有特殊處理,服務器只對請求負責,不對發起請求的人負責。所以在HTTP設計中,每一個請求都是獨立的,每一個請求中都包含了請求的全部數據,服務器只對請求和請求中攜帶的信息進行處理後返回特定結果。就如上面的那個水果店,老闆只根據要買什麼水果,水果多少錢,給了多少錢,進行處理,若是你跟他說你昨天與他交談如何,他無動於衷,由於他徹底不會記得這些事情,他徹底不記得你曾來過。網絡
前面說到,HTTP是無狀態的,每一個請求之間的不會直接地相互影響。
當我第一次調用用戶名密碼驗證接口的時候,我須要輸入帳號、密碼,服務器收到請求以後,就會根據帳號去數據庫取你的密碼和你輸入的密碼進行比對,而後返回一個「密碼正確」或「密碼錯誤」。而問題在於當我第二次訪問這個接口的時候,服務器依舊會執行他的職能:收到我發送的帳號和密碼,而後去數據庫取數據進行比對後返回比對結果,對於服務器來講,每一個請求不過是作了相似1+1是否等於2的判斷而後返回結果而已。app
我想要服務器可以記住我已經調用過一次登陸接口而且以及成功了這個狀態,應該怎麼辦?學習
咱們能夠很天然的想到,服務器不知道咱們登陸過的緣由是由於沒有記下來,要保持登陸狀態,只要讓服務器記下來就能夠了。咱們能夠在服務器專門設置一個存儲,每次只要我驗證帳號和密碼成功,就在這個存儲裏面存下「JabinGP登陸成功」(這個JabinGP是用戶名),這樣咱們服務器就記得JabinGP登陸過了。網站
如今服務器已經知道JabinGP登陸過了,可是這就夠了嗎?不夠,由於HTTP請求並不會自動標明「這是JabinGP發起的請求」,因此咱們還要作點工做讓服務器能知道「這是JabinGP發起的請求」,而後服務器纔好去存儲下來的登陸狀態裏面找「JabinGP登陸成功」這個標誌。怎麼作?咱們能夠在調用請求的時候把本身的用戶名加進請求的參數中,好比Get請求的URl參數、Post請求的請求Body中,這樣服務器就能夠根據咱們的用戶名判斷咱們有沒有登陸過了。設計
這樣咱們就初步的把登陸狀態保存了下來,其實這樣的驗證很是粗糙,因此基於這個思想,產生了下面的技術。接口
有不少品牌的Cookie,好比說藍罐,廣州酒家......什麼?哦哦很差意思我搞錯了,這個纔是Cookie:Cookie就是存儲在客戶端的一小段數據,它能夠存在硬盤中(永久Cookie),也能夠存在內存中(臨時Cookie)內存
Session是指服務器爲某個會話開啓的一段獨特的存儲空間(會話是指一個終端用戶與交互系統進行通信的過程,好比說我先登陸,再查看個人郵箱內容,這個過程就是一個會話),一個Session用惟一的SessionId對應一段存儲空間。
首先從概念上,Cookie和Session都是用來存東西的,問題在於它們都用來存什麼,以及它們都作了什麼?
結合前面分析:
看了上面的Cookie和Session的解釋,以及Cookie和Session的使用,就能夠發現它們兩個其實徹底不衝突,甚至這二者是須要相互配合的,由於Cookie是在客戶端的存儲,Session是在服務端的存儲,Session的存儲須要SessionId來一一對應,這樣纔不會出現xxx得到了JabinGP的登陸狀態而後用JabinGP的錢買東西這樣的狀況,SessionId則須要經過Cookie保存在用戶客戶端中,客戶端經過保存在Cookie的SessionId來標識本身,代表「我就是JabinGP」。
到這裏差很少就簡單介紹完Cookie和Session以及登陸狀態的保持了,以上都是我的理解,用於我的學習記錄,若有錯誤,請必定評論指正!