Cookie、Session是如何保持登錄狀態(tài)的?

無(wú)論是web應(yīng)用還是原生app應(yīng)用,只要涉及網(wǎng)絡(luò)連接,基本就離不開(kāi)登錄注冊(cè),我們注冊(cè)完成后登錄,這個(gè)狀態(tài)就被保持下來(lái)了,我們下次打開(kāi)app,應(yīng)用就已經(jīng)處于登錄狀態(tài)了,不需要我們重復(fù)登錄,非常人性化,感覺(jué)服務(wù)器好像會(huì)“記得”我們每一個(gè)人一樣,“記得”你來(lái)過(guò),就不再要求你登錄了。但其實(shí)計(jì)算機(jī)在這方面是很傻的,他不是自發(fā)“記得”我們的,這篇文章就來(lái)聊聊登錄狀態(tài)的保持是怎么實(shí)現(xiàn)的。

HTTP協(xié)議

要弄明白下面說(shuō)的東西,就得先了解一下HTTP協(xié)議,繁瑣的概念就不多贅述了,這里主要注意一點(diǎn),HTTP協(xié)議是無(wú)狀態(tài)的 ,什么叫無(wú)狀態(tài)?我們從一個(gè)故事講起:

你去一家水果店買(mǎi)水果,你看到他們的桃子很鮮美,于是你大贊了老板的桃子后并買(mǎi)了一斤。你回家嘗了桃子后覺(jué)得非常好吃,你決定第二天繼續(xù)購(gòu)買(mǎi)。當(dāng)你第二天開(kāi)開(kāi)心心的過(guò)來(lái)找老板,跟他說(shuō)“你家的水果真的很好吃,再來(lái)一斤我昨天買(mǎi)的那個(gè)水果”,但是發(fā)現(xiàn)老板并不知道你昨天買(mǎi)過(guò)什么,于是你非常生氣,跟老板說(shuō)“我昨天還夸了很久你的水果,你怎么就不記得了?”一頓理論后你發(fā)現(xiàn)老板始終不記得你昨天干過(guò)什么事,最后你只好跟老板表明要買(mǎi)一斤桃子,交易后灰溜溜地離開(kāi)。

這個(gè)故事中的老板就是無(wú)狀態(tài)的,對(duì)他來(lái)說(shuō),他只知道某個(gè)人要買(mǎi)什么東西,給了多少錢(qián),要買(mǎi)什么水果,要找多少錢(qián),對(duì)于過(guò)程中的其它信息如是“誰(shuí)”來(lái)買(mǎi),他不會(huì)記得,他只會(huì)針對(duì)買(mǎi)賣(mài)本身進(jìn)行處理。

HTTP為什么無(wú)狀態(tài)?

  • 首先什么是無(wú)狀態(tài)?
    無(wú)狀態(tài)就意味著每個(gè)請(qǐng)求之間的不會(huì)直接地相互影響,對(duì)于每個(gè)請(qǐng)求,同樣的請(qǐng)求參數(shù)就會(huì)得到同樣的結(jié)果。

  • 回到HTTP協(xié)議中:
    最初的需求是請(qǐng)求HTML界面顯示出靜態(tài)網(wǎng)站,并不如現(xiàn)在那么復(fù)雜豐富,用戶(hù)A點(diǎn)擊某個(gè)網(wǎng)址瀏覽到的頁(yè)面和用戶(hù)B點(diǎn)擊同樣網(wǎng)址瀏覽到的頁(yè)面是完全一模一樣的,也就是服務(wù)器并不會(huì)對(duì)每個(gè)不同的人有特殊處理,服務(wù)器只對(duì)請(qǐng)求負(fù)責(zé),不對(duì)發(fā)起請(qǐng)求的人負(fù)責(zé)。因此在HTTP設(shè)計(jì)中,每個(gè)請(qǐng)求都是獨(dú)立的,每個(gè)請(qǐng)求中都包含了請(qǐng)求的所有數(shù)據(jù),服務(wù)器只對(duì)請(qǐng)求和請(qǐng)求中攜帶的信息進(jìn)行處理后返回特定結(jié)果。就如上面的那個(gè)水果店,老板只根據(jù)要買(mǎi)什么水果,水果多少錢(qián),給了多少錢(qián),進(jìn)行處理,如果你跟他說(shuō)你昨天與他交談如何,他無(wú)動(dòng)于衷,因?yàn)樗耆粫?huì)記得這些事情,他完全不記得你曾來(lái)過(guò)。

HTTP如何保存登錄狀態(tài)?

前面說(shuō)到,HTTP是無(wú)狀態(tài)的,每個(gè)請(qǐng)求之間的不會(huì)直接地相互影響。

當(dāng)我第一次調(diào)用用戶(hù)名密碼驗(yàn)證接口的時(shí)候,我需要輸入賬號(hào)、密碼,服務(wù)器收到請(qǐng)求之后,就會(huì)根據(jù)賬號(hào)去數(shù)據(jù)庫(kù)取你的密碼和你輸入的密碼進(jìn)行比對(duì),然后返回一個(gè)“密碼正確”或“密碼錯(cuò)誤”。而問(wèn)題在于當(dāng)我第二次訪問(wèn)這個(gè)接口的時(shí)候,服務(wù)器依舊會(huì)執(zhí)行他的職能:收到我發(fā)送的賬號(hào)和密碼,然后去數(shù)據(jù)庫(kù)取數(shù)據(jù)進(jìn)行比對(duì)后返回比對(duì)結(jié)果,對(duì)于服務(wù)器來(lái)說(shuō),每個(gè)請(qǐng)求不過(guò)是做了類(lèi)似1+1是否等于2的判斷然后返回結(jié)果而已。

我想要服務(wù)器能夠記住我已經(jīng)調(diào)用過(guò)一次登錄接口并且以及成功了這個(gè)狀態(tài),應(yīng)該怎么辦?

我們可以很自然的想到,服務(wù)器不知道我們登錄過(guò)的原因是因?yàn)闆](méi)有記下來(lái),要保持登錄狀態(tài),只要讓服務(wù)器記下來(lái)就可以了。我們可以在服務(wù)器專(zhuān)門(mén)設(shè)置一個(gè)存儲(chǔ),每次只要我驗(yàn)證賬號(hào)和密碼成功,就在這個(gè)存儲(chǔ)里面存下“JabinGP登錄成功”(這個(gè)JabinGP是用戶(hù)名),這樣我們服務(wù)器就記得JabinGP登錄過(guò)了。

現(xiàn)在服務(wù)器已經(jīng)知道JabinGP登錄過(guò)了,但是這就夠了嗎?不夠,因?yàn)镠TTP請(qǐng)求并不會(huì)自動(dòng)標(biāo)明“這是JabinGP發(fā)起的請(qǐng)求”,所以我們還要做點(diǎn)工作讓服務(wù)器能知道“這是JabinGP發(fā)起的請(qǐng)求”,然后服務(wù)器才好去存儲(chǔ)下來(lái)的登錄狀態(tài)里面找“JabinGP登錄成功”這個(gè)標(biāo)志。怎么做?我們可以在調(diào)用請(qǐng)求的時(shí)候把自己的用戶(hù)名加進(jìn)請(qǐng)求的參數(shù)中,比如Get請(qǐng)求的URl參數(shù)、Post請(qǐng)求的請(qǐng)求Body中,這樣服務(wù)器就可以根據(jù)我們的用戶(hù)名判斷我們有沒(méi)有登錄過(guò)了。

這樣我們就初步的把登錄狀態(tài)保存了下來(lái),其實(shí)這樣的驗(yàn)證非常粗糙,所以基于這個(gè)思想,產(chǎn)生了下面的技術(shù)。

什么是Cookie?

有很多品牌的Cookie,比如說(shuō)藍(lán)罐,廣州酒家......什么?哦哦不好意思我搞錯(cuò)了,這個(gè)才是Cookie:Cookie就是存儲(chǔ)在客戶(hù)端的一小段數(shù)據(jù),它可以存在硬盤(pán)中(永久Cookie),也可以存在內(nèi)存中(臨時(shí)Cookie)

什么是Session?

Session是指服務(wù)器為某個(gè)會(huì)話開(kāi)啟的一段獨(dú)特的存儲(chǔ)空間(會(huì)話是指一個(gè)終端用戶(hù)與交互系統(tǒng)進(jìn)行通訊的過(guò)程,比如說(shuō)我先登錄,再查看我的郵箱內(nèi)容,這個(gè)過(guò)程就是一個(gè)會(huì)話),一個(gè)Session用唯一的SessionId對(duì)應(yīng)一段存儲(chǔ)空間。

Cookie和Session是怎么用的?

首先從概念上,Cookie和Session都是用來(lái)存東西的,問(wèn)題在于它們都用來(lái)存什么,以及它們都做了什么?
結(jié)合前面分析:

  • Cookie的出現(xiàn),代替了手動(dòng)設(shè)置標(biāo)識(shí)的步驟,因?yàn)槲覀兛梢园褬?biāo)識(shí)設(shè)置在Cookie里面,設(shè)置了Cookie后,Cookie就存在了,下次請(qǐng)求Cookie就會(huì)自動(dòng)發(fā)送給服務(wù)器,這樣我們就不用給每個(gè)請(qǐng)求都很麻煩地手動(dòng)設(shè)置一個(gè)標(biāo)識(shí)(比如前面分析中的用戶(hù)名)。
  • Session其實(shí)就是代替了在服務(wù)器存儲(chǔ)狀態(tài)的步驟,SessionId可以對(duì)應(yīng)一段存儲(chǔ)空間,這段空間對(duì)每個(gè)會(huì)話都是唯一的(比如我登錄后,就產(chǎn)生了一個(gè)會(huì)話,也產(chǎn)生了一段存儲(chǔ)空間,這段存儲(chǔ)空間只被我當(dāng)前的登錄狀態(tài)下的活動(dòng)所使用,別人是用不到的),這樣就可以確保每個(gè)登錄狀態(tài)都有對(duì)應(yīng)的一小段存儲(chǔ)空間來(lái)寫(xiě)入一些中間過(guò)程的數(shù)據(jù)。

Cookie和Session的關(guān)系?

看了上面的Cookie和Session的解釋?zhuān)约癈ookie和Session的使用,就可以發(fā)現(xiàn)它們兩個(gè)其實(shí)完全不沖突,甚至這兩者是需要相互配合的,因?yàn)镃ookie是在客戶(hù)端的存儲(chǔ),Session是在服務(wù)端的存儲(chǔ),Session的存儲(chǔ)需要SessionId來(lái)一一對(duì)應(yīng),這樣才不會(huì)出現(xiàn)xxx獲得了JabinGP的登錄狀態(tài)然后用JabinGP的錢(qián)買(mǎi)東西這樣的情況,SessionId則需要通過(guò)Cookie保存在用戶(hù)客戶(hù)端中,客戶(hù)端通過(guò)保存在Cookie的SessionId來(lái)標(biāo)識(shí)自己,表明“我就是JabinGP”。

到這里差不多就簡(jiǎn)單介紹完Cookie和Session以及登錄狀態(tài)的保持了,以上都是個(gè)人理解,用于個(gè)人學(xué)習(xí)記錄,如有錯(cuò)誤,請(qǐng)一定評(píng)論指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 會(huì)話(Session)跟蹤是Web程序中常用的技術(shù),用來(lái)跟蹤用戶(hù)的整個(gè)會(huì)話。常用的會(huì)話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,778評(píng)論 1 49
  • 背景在HTTP協(xié)議的定義中,采用了一種機(jī)制來(lái)記錄客戶(hù)端和服務(wù)器端交互的信息,這種機(jī)制被稱(chēng)為cookie,cooki...
    時(shí)芥藍(lán)閱讀 2,455評(píng)論 1 17
  • 繼續(xù)這一個(gè)系列,基于Token的WEB后臺(tái)登錄認(rèn)證機(jī)制(并講解cookie和session機(jī)制)。每個(gè)后端不得不解...
    JackFrost_fuzhu閱讀 18,569評(píng)論 11 80
  • 以前給她說(shuō),害怕被別人喜歡。所以要酷酷的。她說(shuō)我,神經(jīng)病。 現(xiàn)在身邊鬧哄哄的,持續(xù)得和不同的人互動(dòng)著。也不怕被別人...
    杜煩人閱讀 174評(píng)論 0 0
  • 周末老公孩子去爺爺奶奶家,我一個(gè)人窩在家看了《當(dāng)哈利遇到薩莉》 梅格瑞恩眼睛里有星星?,閃呀閃呀閃得我好心動(dòng)啊 嘣...
    cicich閱讀 200評(píng)論 0 0

友情鏈接更多精彩內(nèi)容