摘要:無狀態(tài)協(xié)議無狀態(tài)協(xié)議,是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。是通過客戶端保持狀態(tài)的解決方案。而這次,信息則存放在請求頭了。
HTTP無狀態(tài)協(xié)議
HTTP無狀態(tài)協(xié)議,是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時它的應(yīng)答就較快。
簡介
客戶端與服務(wù)器進行動態(tài)交互的Web應(yīng)用程序出現(xiàn)之后,HTTP無狀態(tài)的特性嚴重阻礙了這些應(yīng)用程序的實現(xiàn),畢竟交互是需要承前啟后的,簡單的購物車程序也要知道用戶到底在之前選擇了什么商品。于是,兩種用于保持HTTP連接狀態(tài)的技術(shù)就應(yīng)運而生了,一個是Cookie,而另一個則是Session。HTTP本身是一個無狀態(tài)的連接協(xié)議,為了支持客戶端與服務(wù)器之間的交互,我們就需要通過不同的技術(shù)為交互存儲狀態(tài),而這些不同的技術(shù)就是Cookie和Session了。Cookie是通過客戶端保持狀態(tài)的解決方案。從定義上來說,Cookie就是由服務(wù)器發(fā)給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端,然后客戶端每次向服務(wù)器發(fā)送請求的時候都會帶上這些特殊的信息。讓我們說得更具體一些:當用戶使用瀏覽器訪問一個支持Cookie的網(wǎng)站的時候,用戶會提供包括用戶名在內(nèi)的個人信息并且提交至服務(wù)器;接著,服務(wù)器在向客戶端回傳相應(yīng)的超文本的同時也會發(fā)回這些個人信息,當然這些信息并不是存放在HTTP響應(yīng)體(Response Body)中的,而是存放于HTTP響應(yīng)頭(Response Header);當客戶端瀏覽器接收到來自服務(wù)器的響應(yīng)之后,瀏覽器會將這些信息存放在一個統(tǒng)一的位置,對于Windows操作系統(tǒng)而言,我們可以從: [系統(tǒng)盤]:Documents and Settings[用戶名]Cookies目錄中找到存儲的Cookie;自此,客戶端再向服務(wù)器發(fā)送請求的時候,都會把相應(yīng)的Cookie再次發(fā)回至服務(wù)器。而這次,Cookie信息則存放在HTTP請求頭(Request Header)了。斜體文字
發(fā)展
有了Cookie這樣的技術(shù)實現(xiàn),服務(wù)器在接收到來自客戶端瀏覽器的請求之后,就能夠通過分析存放于請求頭的Cookie得到客戶端特有的信息,從而動態(tài)生成與該客戶端相對應(yīng)的內(nèi)容。通常,我們可以從很多網(wǎng)站的登錄界面中看到“請記住我”這樣的選項,如果你勾選了它之后再登錄,那么在下一次訪問該網(wǎng)站的時候就不需要進行重復(fù)而繁瑣的登錄動作了,而這個功能就是通過Cookie實現(xiàn)的。Cookie與Cookie相對的一個解決方案是Session,它是通過服務(wù)器來保持狀態(tài)的。由于Session這個詞匯包含的語義很多,因此需要在這里明確一下 Session的含義。首先,我們通常都會把Session翻譯成會話,因此我們可以把客戶端瀏覽器與服務(wù)器之間一系列交互的動作稱為一個 Session。從這個語義出發(fā),我們會提到Session持續(xù)的時間,會提到在Session過程中進行了什么操作等等;其次,Session指的是服務(wù)器端為客戶端所開辟的存儲空間,在其中保存的信息就是用于保持狀態(tài)。從這個語義出發(fā),我們則會提到往Session中存放什么內(nèi)容,如何根據(jù)鍵值從 Session中獲取匹配的內(nèi)容等。
要使用Session,第一步當然是創(chuàng)建Session了。那么Session在何時創(chuàng)建呢?當然還是在服務(wù)器端程序運行的過程中創(chuàng)建的,不同語言實現(xiàn)的應(yīng)用程序有不同創(chuàng)建Session的方法,而在Java中是通過調(diào)用HttpServletRequest的getSession方法(使用true作為參數(shù))創(chuàng)建的。在創(chuàng)建了Session的同時,服務(wù)器會為該Session生成唯一的Session id,而這個Session id在隨后的請求中會被用來重新獲得已經(jīng)創(chuàng)建的Session;在Session被創(chuàng)建之后,就可以調(diào)用Session相關(guān)的方法往Session中增加內(nèi)容了,而這些內(nèi)容只會保存在服務(wù)器中,發(fā)到客戶端的只有Session id;當客戶端再次發(fā)送請求的時候,會將這個Session id帶上,服務(wù)器接受到請求之后就會依據(jù)Session id找到相應(yīng)的Session,從而再次使用之。正是這樣一個過程,用戶的狀態(tài)也就得以保持了。
綜上所述,HTTP本身是一個無狀態(tài)的連接協(xié)議,為了支持客戶端與服務(wù)器之間的交互,我們就需要通過不同的技術(shù)為交互存儲狀態(tài),而這些不同的技術(shù)就是Cookie和Session了。
存放位置
cookie數(shù)據(jù)存放在客戶的瀏覽器上,服務(wù)器能夠知道其中的信息;
使用方式
如果在瀏覽器中不設(shè)置過期時間,cookie被保存在內(nèi)存中,生命周期隨瀏覽器的關(guān)閉而結(jié)束,這種cookie簡稱會話cookie。如果在瀏覽器中設(shè)置了cookie的過期時間,cookie被保存在硬盤中,關(guān)閉瀏覽器后,cookie數(shù)據(jù)仍然存在,直到過期時間結(jié)束才消失。
存儲
單個cookie保存的數(shù)據(jù)不能超過4KB,一個服務(wù)器最多在客戶端瀏覽器上保存20個Cookie,一個瀏覽器最多保存300個Cookie;
cookie只能保存字符串類型,以文本的方式
應(yīng)用場景
cookie技術(shù)有4個組件:在HTTP響應(yīng)報文中有一個cookie首部行;在HTTP請求報文中有一個cookie首部行;在用戶端系統(tǒng)中保留有一個cookie文件,并由用戶的瀏覽器進行管理;位于Web站點的一個后端數(shù)據(jù)庫
判斷用戶是否登陸過網(wǎng)站,以便下次登錄時能夠?qū)崿F(xiàn)自動登錄(或者記住密碼)。
如果我們刪除cookie,則每次登錄必須從新填寫登錄的相關(guān)信息。
保存上次登錄的時間等信息。 保存上次查看的頁面 瀏覽計數(shù)
訪問
cookie中如果設(shè)置了路徑參數(shù),那么同一個網(wǎng)站中不同路徑下的cookie互相是訪問不到的。
缺點
大小受限、用戶可以操作(禁用)cookie,使功能受限、、安全性較低、有些狀態(tài)不可能保存在客戶端、每次訪問都要傳送cookie給服務(wù)器,浪費帶寬、cookie數(shù)據(jù)有路徑(path)的概念,可以限制cookie只屬于某個路徑下。
其他
攜帶cookie進行數(shù)據(jù)請求
cookie數(shù)據(jù)始終在同源的http請求中攜帶(即使不需要),即cookie在瀏覽器和服務(wù)器間來回傳遞;Session
每次請求一個新的頁面的時候cookie都會被發(fā)送過去,這樣無形中浪費了帶寬,另外cookie還需要指定作用域,不可跨域調(diào)用。
存放位置
session數(shù)據(jù)放在服務(wù)器上,客戶端不知道其中的信息,不過session可以通過特殊的方式做持久化管理(memcache,redis);
使用方式
session在什么時候創(chuàng)建,以及session一致性問題
session會在一定時間內(nèi)保存在服務(wù)器上,當訪問增多,會比較占用你服務(wù)器的性能,考慮到減輕服務(wù)器性能方面,應(yīng)當使用cookie
當程序需要為某個客戶端的請求創(chuàng)建一個session時,服務(wù)器首先檢查這個客戶端的請求里是否已包含了一個session標識(稱為session id),如果已包含則說明以前已經(jīng)為此客戶端創(chuàng)建過session,服務(wù)器就按照session id把這個session檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為客戶端創(chuàng)建一個session并且生成一個與此session相關(guān)聯(lián)的session id,session id的值應(yīng)該是一個既不會重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個session id將被在本次響應(yīng)中返回給客戶端保存。保存這個session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把這個標識發(fā)送給服務(wù)器。通常使用cookie方式存儲sessionid到客戶端,在交互中瀏覽器按照規(guī)則將sessionid發(fā)送給服務(wù)器。如果用戶禁用cookie,則要使用URL重寫,可以通過response.encodeURL(url)
進行實現(xiàn);API對encodeURL的結(jié)束為,當瀏覽器支持Cookie時,url不做任何處理;當瀏覽器不支持Cookie的時候,將會重寫URL將SessionID拼接到訪問地址后。
存儲
session大小沒有限制
session中保存的是對象,session通過類似與Hashtable的數(shù)據(jù)結(jié)構(gòu)來保存,能支持任何類型的對象(session中可含有多個對象)
應(yīng)用場景
Session用于保存每個用戶的專用信息,變量的值保存在服務(wù)器端,通過SessionID來區(qū)分不同的客戶。
網(wǎng)上商城中的購物車
保存用戶登錄信息
將某些數(shù)據(jù)放入session中,供同一用戶的不同頁面使用
防止用戶非法登錄
訪問
session不能區(qū)分路徑,同一個用戶在訪問一個網(wǎng)站期間,所有的session在任何一個地方都可以訪問到。
缺點
Session保存的東西越多,就越占用服務(wù)器內(nèi)存,對于用戶在線人數(shù)較多的網(wǎng)站,服務(wù)器的內(nèi)存壓力會比較大、依賴于cookie(sessionID保存在cookie),如果禁用cookie,則要使用URL重寫,不安全、創(chuàng)建Session變量有很大的隨意性,可隨時調(diào)用,不需要開發(fā)者做精確地處理,所以,過度使用session變量將會導(dǎo)致代碼不可讀而且不好維護。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/103380.html
摘要:無狀態(tài)協(xié)議無狀態(tài)協(xié)議,是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。是通過客戶端保持狀態(tài)的解決方案。而這次,信息則存放在請求頭了。 HTTP無狀態(tài)協(xié)議 HTTP無狀態(tài)協(xié)議,是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方...
摘要:最近的一次更新的變量有效,并且會作用于全部的引用的處理方式和相同,變量值輸出時根據(jù)之前最近的一次定義計算,每次引用最近的定義有效嵌套三種預(yù)編譯器的選擇器嵌套在使用上來說沒有任何區(qū)別,甚至連引用父級選擇器的標記也相同。 面試匯總一:2018大廠高級前端面試題匯總 高級面試:【半月刊】前端高頻面試題及答案匯總 css內(nèi)容 響應(yīng)式布局 當前主流的三種預(yù)編譯器比較 CSS預(yù)處理器用一種專門的...
摘要:如何實現(xiàn)持久化持久化,將在內(nèi)存中的的狀態(tài)保存到硬盤中,相當于備份數(shù)據(jù)庫狀態(tài)持久化,持久化是通過保存服務(wù)器鎖執(zhí)行的寫狀態(tài)來記錄數(shù)據(jù)庫的。 showImg(https://segmentfault.com/img/bVbejmD?w=643&h=404); 這是我整理的一套面試題,老鐵們看看就當復(fù)習(xí)了哦 概述 感覺現(xiàn)在發(fā)面試題有些冷門,就跟昨天德國那場似的,不過看看當提前復(fù)習(xí)了。提前備戰(zhàn)。...
摘要:線程在執(zhí)行過程中與進程還是有區(qū)別的。但是線程不能夠獨立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制。從邏輯角度來看,多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行。 關(guān)于js 1.原型鏈 2.AJAX請求數(shù)據(jù)時解決緩存的辦法3.js的繼承 ...
摘要:一的會話也稱為。如果啟動會話成功,則函數(shù)返回,否則返回。會話啟動后就可以載入該會話已經(jīng)注冊的會話變量以便使用。但數(shù)組創(chuàng)建的在會話結(jié)束后就會失效。預(yù)告本周三更新面試常考之網(wǎng)絡(luò)協(xié)議,敬請期待。 你好,是我琉憶,歡迎您來到PHP面試專欄。本周(2019.2-25至3-1)的一三五更新的文章如下: 周一:PHP面試常考之會話控制周三:PHP面試常考之網(wǎng)絡(luò)協(xié)議周五:PHP面試常考題之會話控制和...
閱讀 894·2021-09-03 10:42
閱讀 1511·2019-08-30 15:56
閱讀 1444·2019-08-29 17:27
閱讀 870·2019-08-29 15:25
閱讀 3156·2019-08-26 18:27
閱讀 2480·2019-08-26 13:41
閱讀 1888·2019-08-26 10:39
閱讀 1570·2019-08-23 18:36