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