HTTP是一種無狀態(tài)的協(xié)議,為了分辨鏈接是誰發(fā)起的柱衔,需自己去解決這個(gè)問題言沐。不然有些情況下即使是同一個(gè)網(wǎng)站每打開一個(gè)頁面也都要登錄一下望浩。而Session和Cookie就是為解決這個(gè)問題而提出來的兩個(gè)機(jī)制次酌。
Cookie
在程序中恨课,會話跟蹤是很重要的事情舆乔。理論上岳服,一個(gè)用戶的所有請求操作都應(yīng)該屬于同一個(gè)會話,而另一個(gè)用戶的所有請求操作則應(yīng)該屬于另一個(gè)會話希俩,二者不能混淆吊宋。例如,用戶A在超市購買的任何商品都應(yīng)該放在A的購物車內(nèi)颜武,不論是用戶A什么時(shí)間購買的璃搜,這都是屬于同一個(gè)會話的,不能放入用戶B或用戶C的購物車內(nèi)鳞上,這不屬于同一個(gè)會話这吻。
而Web應(yīng)用程序是使用HTTP協(xié)議傳輸數(shù)據(jù)的。HTTP協(xié)議是無狀態(tài)的協(xié)議篙议。一旦數(shù)據(jù)交換完畢唾糯,客戶端與服務(wù)器端的連接就會關(guān)閉,再次交換數(shù)據(jù)需要建立新的連接鬼贱。這就意味著服務(wù)器無法從連接上跟蹤會話移怯。即用戶A購買了一件商品放入購物車內(nèi),當(dāng)再次購買商品時(shí)服務(wù)器已經(jīng)無法判斷該購買行為是屬于用戶A的會話還是用戶B的會話了这难。要跟蹤該會話舟误,必須引入一種機(jī)制。
Cookie技術(shù)是客戶端的解決方案姻乓,Cookie就是由服務(wù)器發(fā)給客戶端的特殊信息嵌溢,而這些信息以文本文件的方式存放在客戶端,然后客戶端每次向服務(wù)器發(fā)送請求的時(shí)候都會帶上這些特殊的信息蹋岩。讓我們說得更具體一些:當(dāng)用戶使用瀏覽器訪問一個(gè)支持Cookie的網(wǎng)站的時(shí)候堵腹,用戶會提供包括用戶名在內(nèi)的個(gè)人信息并且提交至服務(wù)器;接著星澳,服務(wù)器在向客戶端回傳相應(yīng)的超文本的同時(shí)也會發(fā)回這些個(gè)人信息疚顷,當(dāng)然這些信息并不是存放在HTTP響應(yīng)體(Response Body)中的,而是存放于HTTP響應(yīng)頭(Response Header);當(dāng)客戶端瀏覽器接收到來自服務(wù)器的響應(yīng)之后腿堤,瀏覽器會將這些信息存放在一個(gè)統(tǒng)一的位置阀坏,對于Windows操作系統(tǒng)而言,我們可以從: [系統(tǒng)盤]:\Documents and Settings[用戶名]\Cookies目錄中找到存儲的Cookie笆檀;自此忌堂,客戶端再向服務(wù)器發(fā)送請求的時(shí)候,都會把相應(yīng)的Cookie再次發(fā)回至服務(wù)器酗洒。而這次士修,Cookie信息則存放在HTTP請求頭(Request Header)了。有了Cookie這樣的技術(shù)實(shí)現(xiàn)樱衷,服務(wù)器在接收到來自客戶端瀏覽器的請求之后棋嘲,就能夠通過分析存放于請求頭的Cookie得到客戶端特有的信息,從而動(dòng)態(tài)生成與該客戶端相對應(yīng)的內(nèi)容矩桂。通常沸移,我們可以從很多網(wǎng)站的登錄界面中看到“請記住我”這樣的選項(xiàng),如果你勾選了它之后再登錄侄榴,那么在下一次訪問該網(wǎng)站的時(shí)候就不需要進(jìn)行重復(fù)而繁瑣的登錄動(dòng)作了雹锣,而這個(gè)功能就是通過Cookie實(shí)現(xiàn)的。
Cookie就是這樣的一種機(jī)制癞蚕。它可以彌補(bǔ)HTTP協(xié)議無狀態(tài)的不足蕊爵。在Session出現(xiàn)之前,基本上所有的網(wǎng)站都采用Cookie來跟蹤會話桦山。
如果你把Cookies看成為http協(xié)議的一個(gè)擴(kuò)展的話攒射,理解起來就容易的多了,其實(shí)本質(zhì)上cookies就是http的一個(gè)擴(kuò)展度苔。有兩個(gè)http頭部是專門負(fù)責(zé)設(shè)置以及發(fā)送cookie的,它們分別是Set-Cookie以及Cookie匆篓。當(dāng)服務(wù)器返回給客戶端一個(gè)http響應(yīng)信息時(shí),其中如果包含Set-Cookie這個(gè)頭部時(shí)寇窑,意思就是指示客戶端建立一個(gè)cookie鸦概,并且在后續(xù)的http請求中自動(dòng)發(fā)送這個(gè)cookie到服務(wù)器端,直到這個(gè)cookie過期甩骏。如果cookie的生存時(shí)間是整個(gè)會話期間的話窗市,那么瀏覽器會將cookie保存在內(nèi)存中,瀏覽器關(guān)閉時(shí)就會自動(dòng)清除這個(gè)cookie饮笛。另外一種情況就是保存在客戶端的硬盤中咨察,瀏覽器關(guān)閉的話,該cookie也不會被清除福青,下次打開瀏覽器訪問對應(yīng)網(wǎng)站時(shí)摄狱,這個(gè)cookie就會自動(dòng)再次發(fā)送到服務(wù)器端脓诡。一個(gè)cookie的設(shè)置以及發(fā)送過程分為以下四步:
但是由于cookie 是存在用戶端,而且它本身存儲的尺寸大小也有限媒役,最關(guān)鍵是用戶可以是可見的祝谚,并可以隨意的修改,很不安全酣衷。那如何又要安全交惯,又可以方便的全局讀取信息呢?于是穿仪,這個(gè)時(shí)候席爽,一種新的存儲會話機(jī)制:session 誕生了。
Session
當(dāng)訪問服務(wù)器否個(gè)網(wǎng)頁的時(shí)候啊片,會在服務(wù)器端的內(nèi)存里開辟一塊內(nèi)存只锻,這塊內(nèi)存就叫做session,而這個(gè)內(nèi)存是跟瀏覽器關(guān)聯(lián)在一起的钠龙。這個(gè)瀏覽器指的是瀏覽器窗口炬藤,或者是瀏覽器的子窗口御铃,意思就是碴里,只允許當(dāng)前這個(gè)session對應(yīng)的瀏覽器訪問,就算是在同一個(gè)機(jī)器上新啟的瀏覽器也是無法訪問的上真。而另外一個(gè)瀏覽器也需要記錄session的話咬腋,就會再啟一個(gè)屬于自己的session
當(dāng)訪問一個(gè)頁面的時(shí)候給瀏覽器創(chuàng)建一個(gè)獨(dú)一無二的號碼,也給同時(shí)創(chuàng)建的session賦予同樣的號碼睡互。這樣就可以在打開同一個(gè)網(wǎng)站的第二個(gè)頁面時(shí)獲取到第一個(gè)頁面中session保留下來的對應(yīng)信息(理解:當(dāng)訪問第二個(gè)頁面時(shí)將號碼同時(shí)傳遞到第二個(gè)頁面根竿。找到對應(yīng)的session。)就珠。這個(gè)號碼也叫sessionID寇壳,session的ID號碼,session的獨(dú)一無二號碼妻怎。