2020-4-22 前端達(dá)人
目錄
HTTP協(xié)議
HTTP請(qǐng)求:
HTTP響應(yīng):
會(huì)話與會(huì)話狀態(tài):
Cookie
Session
Cookie和Session的區(qū)別
HTTP協(xié)議
HTTP請(qǐng)求:
Post /test.php HTTP/1.1 //請(qǐng)求行以一個(gè)方法符號(hào)開(kāi)頭,以空格分開(kāi),后面跟著請(qǐng)求的URI和協(xié)議的版本
Host: www.test.com //請(qǐng)求頭
User-agent:mozilla/5.0(windows NT 6.1: rv: 15.0)
Gecko/20100101 firefox15.0
//空白行,代表請(qǐng)求頭結(jié)束
Username=admin&passwd=admin //請(qǐng)求正文
HTTP請(qǐng)求方法
GET 請(qǐng)求獲取Request-URI所標(biāo)識(shí)的資源
POST 在Request-URI所標(biāo)識(shí)的資源后附加新的數(shù)據(jù)
HEAD 請(qǐng)求獲取由Request-URI所標(biāo)識(shí)的資源的響應(yīng)消息報(bào)頭
PUT 請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源,并用Request-URI作為其標(biāo)識(shí)
常用的為GET和POST;GET和POST的區(qū)別:
GET提交的內(nèi)容會(huì)直接顯示在URL中,私密性較差,可以用于顯示一些公共資源;但是GET效率會(huì)比較高。
POST不會(huì)將內(nèi)容顯示在URL中,可以用于提交一些敏感數(shù)據(jù),例如用戶名或密碼。
HTTP響應(yīng):
HTTP/1.1 200 OK //響應(yīng)行由協(xié)議版本號(hào),響應(yīng)狀態(tài)碼和文本描述組成
Data:sun,15 nov 2018 11:02:04 GMT //響應(yīng)頭
Server:bfe/1.0.8.9
……
Connection: keep-alive
//空白行,代表響應(yīng)頭結(jié)束
<html>
</html><title>index.heml</title> //響應(yīng)正文
HTTP的狀態(tài)碼:
狀態(tài)代碼由三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,且有五種可能取值。
1xx:指示信息 —— 表示請(qǐng)求已接收,繼續(xù)處理。
2xx:成功 —— 表示請(qǐng)求已被成功接收、理解、接受。
3xx:重定向 —— 要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作。
4xx:客戶端錯(cuò)誤 —— 請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)。
5xx:服務(wù)器端錯(cuò)誤 —— 服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求。
常見(jiàn)狀態(tài)代碼、狀態(tài)描述的說(shuō)明如下。
200 OK:客戶端請(qǐng)求成功。
400 Bad Request:客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解。
401 Unauthorized:請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和 WWW-Authenticate 報(bào)頭域一起使用。
403 Forbidden:服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)。
404 Not Found:請(qǐng)求資源不存在,舉個(gè)例子:輸入了錯(cuò)誤的URL。
500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤。
503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常。
會(huì)話與會(huì)話狀態(tài):
Web中的會(huì)話是指一個(gè)客戶端瀏覽器與web服務(wù)器之間連續(xù)發(fā)生一系列請(qǐng)求和響應(yīng)過(guò)程。會(huì)話狀態(tài)是指在會(huì)話過(guò)程中產(chǎn)生的狀態(tài)信息;借助會(huì)話狀態(tài),web服務(wù)器能夠把屬于同一會(huì)話中的一系列的請(qǐng)求和響應(yīng)關(guān)聯(lián)起來(lái)。
Cookie
概述
Cookie是一種在客戶端保持HTTP狀態(tài)信息的技術(shù),它好比商場(chǎng)發(fā)放的優(yōu)惠卡。在瀏覽器訪問(wèn)Web服務(wù)器的某個(gè)資源時(shí),由Web服務(wù)器在在HTTP響應(yīng)頭中附帶傳送給瀏覽器一片數(shù)據(jù),web服務(wù)器傳送給各個(gè)客戶端瀏覽器的數(shù)據(jù)是可以各不相同的。
一旦Web瀏覽器保存了某個(gè)Cookie,那么它在以后每次訪問(wèn)該Web服務(wù)器是都應(yīng)在HTTP請(qǐng)求頭中將這個(gè)Cookie回傳個(gè)Web服務(wù)器。Web服務(wù)器通過(guò)在HTTP響應(yīng)消息中增加Set-Cookie響應(yīng)頭字段將CooKie信息發(fā)送給瀏覽器,瀏覽器則通過(guò)在HTTP請(qǐng)求消息中增加Cookie請(qǐng)求頭字段將Cookie回傳給Web服務(wù)器。
一個(gè)Cookie只能標(biāo)識(shí)一種信息,它至少含有一個(gè)標(biāo)識(shí)該消息的名稱(NAME)和和設(shè)置值(VALUE)。一個(gè)Web瀏覽器也可以存儲(chǔ)多個(gè)Web站點(diǎn)提供的Cookie。瀏覽器一般只允許存放300個(gè)Cookie,每個(gè)站點(diǎn)最多存放20個(gè)Cookie,每個(gè)Cookie的大小限制為4KB。
傳送示意圖
特點(diǎn)
存儲(chǔ)于瀏覽器頭部/傳輸與HTTP頭部,寫時(shí)帶屬性,讀時(shí)無(wú)屬性。由三元【name,domain,path】唯一確定Cookie。
Set-Cookie2響應(yīng)頭字段
Set-Cookie2頭字段用于指定WEB服務(wù)器向客戶端傳送的Cookie內(nèi)容,但是按照Netscape規(guī)范實(shí)現(xiàn)Cookie功能的WEB服務(wù)器, 使用的是Set-Cookie頭字段,兩者的語(yǔ)法和作用類似。Set-Cookie2頭字段中設(shè)置的cookie內(nèi)容是具有一定格式的字符串,它必須以Cookie的名稱和設(shè)置值開(kāi)頭,格式為"名稱=值”,后面可以加上0個(gè)或多個(gè)以分號(hào)(;) 和空格分隔的其它可選屬性,屬性格式一般為 "屬性名=值”。
除了“名稱=值”對(duì)必須位于最前面外,其他的可選屬性可以任意。Cookie的名稱只能由普通的英文ASCII字符組成,瀏覽器不用關(guān)心和理解Cookie的值部分的意義和格式,只要WEB服務(wù)器能理解值部分的意義就行。大多數(shù)現(xiàn)有的WEB服務(wù)器都是采用某種編碼方式將值部分的內(nèi)容編碼成可打印的ASCII字符,RFC 2965規(guī)范中沒(méi)有明確限定編碼方式。
舉例: Set-Cookie2: user-hello; Version=1; Path=/
Cookie請(qǐng)求頭字段
Cookie請(qǐng)求頭字段中的每個(gè)Cookie之間用逗號(hào)(,)或分號(hào)(;)分隔。在Cookie請(qǐng)求字段中除了必須有“名稱=值”的設(shè)置外,還可以有Version、path、domain、port等屬性;在Version、path、domain、port等屬性名之前,都要增加一個(gè)“$”字符作為前綴。Version屬性只能出現(xiàn)一次,且要位于Cookie請(qǐng)求頭字段設(shè)置值的最前面,如果需要設(shè)置某個(gè)Cookie信息的Path、Domain、Port等屬性,它們必須位于該Cookie信息的“名稱=值”設(shè)置之后。
瀏覽器使用Cookie請(qǐng)求頭字段將Cookie信息會(huì)送給Web服務(wù)器;多個(gè)Cookie信息通過(guò)一個(gè)Cookie請(qǐng)求頭字段會(huì)送給Web服務(wù)器。
瀏覽器會(huì)根據(jù)下面幾個(gè)規(guī)則決定是否發(fā)送某個(gè)Cookie信息:
1、請(qǐng)求主機(jī)名是否與某個(gè)存儲(chǔ)的Cookie的Domain屬性匹配
2、請(qǐng)求的端口號(hào)是否在該Cookie的Port屬性列表中
3、請(qǐng)求的資源路徑是否在該Cookie的Path屬性指定的目錄及子目錄中
4、該Cookie的有效期是否已過(guò)
Path屬性的指向子目錄的Cookie排在Path屬性指向父目錄的Cookie之前
舉例: Cookie: $Version=1; Course=Java; $Path=/hello/lesson;Course=vc; $Path=/hello
Cookie的安全屬性
secure屬性
當(dāng)設(shè)置為true時(shí),表示創(chuàng)建的Cookie會(huì)被以安全的形式向服務(wù)器傳輸,也就是只能在HTTPS連接中被瀏覽器傳遞到服務(wù)器端進(jìn)行會(huì)話驗(yàn)證,如果是HTTP連接則不會(huì)傳遞該信息,所以不會(huì)被竊取到Cookie的具體內(nèi)容。
HttpOnly屬性
如果在Cookie中設(shè)置了"HttpOnly"屬性,那么通過(guò)程序(JS腳本、Applet等)將無(wú)法讀取到Cookie信息,這樣能有效的防止XSS攻擊。
總結(jié):secure屬性 是防止信息在傳遞的過(guò)程中被監(jiān)聽(tīng)捕獲后信息泄漏,HttpOnly屬性的目的是防止程序獲取cookie后進(jìn)行攻擊這兩個(gè)屬性并不能解決cookie在本機(jī)出現(xiàn)的信息泄漏的問(wèn)題(FireFox的插件FireBug能直接看到cookie的相關(guān)信息)。
Session
使用Cookie和附加URL參數(shù)都可以將上一-次請(qǐng)求的狀態(tài)信息傳遞到下一次請(qǐng)求中,但是如果傳遞的狀態(tài)信息較多,將極大降低網(wǎng)絡(luò)傳輸效率和增大服務(wù)器端程序處理的難度。
概述
Session技術(shù)是一種將會(huì)話狀態(tài)保存在服務(wù)器端的技術(shù),它可以比喻成是醫(yī)院發(fā)放給病人的病歷卡和醫(yī)院為每個(gè)病人保留的病歷檔案的結(jié)合方式??蛻舳诵枰邮铡⒂洃浐突厮蚐ession的會(huì)話標(biāo)識(shí)號(hào),Session可以且通常是借助Cookie來(lái)傳遞會(huì)話標(biāo)識(shí)號(hào)。
Session的跟蹤機(jī)制
HttpSession對(duì)象是保持會(huì)話狀態(tài)信息的存儲(chǔ)結(jié)構(gòu),一個(gè)客戶端在WEB服務(wù)器端對(duì)應(yīng)一個(gè)各自的HttpSession對(duì)象。WEB服務(wù)器并不會(huì)在客戶端開(kāi)始訪問(wèn)它時(shí)就創(chuàng)建HttpSession對(duì)象,只有客戶端訪問(wèn)某個(gè)能與客戶端開(kāi)啟會(huì)話的服務(wù)端程序時(shí),WEB應(yīng)用程序才會(huì)創(chuàng)建一個(gè)與該客戶端對(duì)應(yīng)的HttpSession對(duì)象。WEB服務(wù)器為HttpSession對(duì)象分配一個(gè)獨(dú)一無(wú)的會(huì)話標(biāo)識(shí)號(hào), 然后在響應(yīng)消息中將這個(gè)會(huì)話標(biāo)識(shí)號(hào)傳遞給客戶端??蛻舳诵枰涀?huì)話標(biāo)識(shí)號(hào),并在后續(xù)的每次訪問(wèn)請(qǐng)求中都把這個(gè)會(huì)話標(biāo)識(shí)號(hào)傳送給WEB服務(wù)器,WEB服務(wù)器端程序依據(jù)回傳的會(huì)話標(biāo)識(shí)號(hào)就知道這次請(qǐng)求是哪個(gè)客戶端發(fā)出的,從而選擇與之對(duì)應(yīng)的HttpSession對(duì)象。
WEB應(yīng)用程序創(chuàng)建了與某個(gè)客戶端對(duì)應(yīng)的HttpSession對(duì)象后,只要沒(méi)有超出一個(gè)限定的空閑時(shí)間段,HttpSession對(duì)象就駐留在WEB服務(wù)器內(nèi)存之中,該客戶端此后訪問(wèn)任意的Servlet程序時(shí),它們都使用與客戶端對(duì)應(yīng)的那個(gè)已存在的HttpSession對(duì)象。
Session是實(shí)現(xiàn)網(wǎng)上商城的購(gòu)物車的最佳方案,存儲(chǔ)在某個(gè)客戶Session中的一個(gè)集合對(duì)象就可充當(dāng)該客戶的一個(gè)購(gòu)物車。
超時(shí)管理
WEB服務(wù)器無(wú)法判斷當(dāng)前的客戶端瀏覽器是否還會(huì)繼續(xù)訪問(wèn),也無(wú)法檢測(cè)客戶端瀏覽器是否關(guān)閉,所以,即使客戶已經(jīng)離開(kāi)或關(guān)閉了瀏覽器,WEB服務(wù)器還要保留與之對(duì)應(yīng)的HttpSession對(duì)象。隨著時(shí)間的推移而不斷增加新的訪問(wèn)客戶端,WEB服務(wù)器內(nèi)存中將會(huì)因此積累起大量的不再被使用的HttpSession對(duì)象,并將最終導(dǎo)致服務(wù)器內(nèi)存耗盡。WEB服務(wù)器采用“超時(shí)限制”的辦法來(lái)判斷客戶端是否還在繼續(xù)訪問(wèn)如果某個(gè)客戶端在一定的時(shí)間之 內(nèi)沒(méi)有發(fā)出后續(xù)請(qǐng)求,WEB服務(wù)器則認(rèn)為客戶端已經(jīng)停止了活動(dòng),結(jié)束與該客戶端的會(huì)話并將與之對(duì)應(yīng)的HttpSession對(duì)象變成垃圾。
如果客戶端瀏覽器超時(shí)后再次發(fā)出訪問(wèn)請(qǐng)求,Web服務(wù)器則認(rèn)為這是一個(gè)新的會(huì)話開(kāi)始,將為之創(chuàng)建新的Httpsession對(duì)象和分配新的會(huì)話標(biāo)識(shí)號(hào)。
利用Cookie實(shí)現(xiàn)Session的跟蹤
如果WEB服務(wù)器處理某個(gè)訪問(wèn)請(qǐng)求時(shí)創(chuàng)建了新的HttpSession對(duì)象,它將把會(huì)話標(biāo)識(shí)號(hào)作為一個(gè)Cookie項(xiàng)加入到響應(yīng)消息中,通常情況下,瀏覽器在隨后發(fā)出的訪問(wèn)請(qǐng)求中又將會(huì)話標(biāo)識(shí)號(hào)以Cookie的形式回傳給WEB服務(wù)器。WEB服務(wù)器端程序依據(jù)回傳的會(huì)話標(biāo)識(shí)號(hào)就知道以前已經(jīng)為該客戶端創(chuàng)建了HttpSession對(duì)象,不必再為該客戶端創(chuàng)建新的HttpSession對(duì)象,而是直接使用與該會(huì)話標(biāo)識(shí)號(hào)匹配的HttpSession對(duì)象,通過(guò)這種方式就實(shí)現(xiàn)了對(duì)同一個(gè)客戶端的會(huì)話狀態(tài)的跟蹤。
利用URL重寫實(shí)現(xiàn)Session跟蹤
Servlet規(guī)范中引入了一種補(bǔ)充的會(huì)話管理機(jī)制,它允許不支持Cookie的瀏覽器也可以與WEB服務(wù)器保持連續(xù)的會(huì)話。這種補(bǔ)充機(jī)制要求在響應(yīng)消息的實(shí)體內(nèi)容中必須包含下一 次請(qǐng)求的超鏈接,并將會(huì)話標(biāo)識(shí)號(hào)作為超鏈接的URL地址的一個(gè)特殊參數(shù)。將會(huì)話標(biāo)識(shí)號(hào)以參數(shù)形式附加在超鏈接的URL地址后面的技術(shù)稱為URL重寫。 如果在瀏覽器不支持Cookie或者關(guān)閉了Cookie功能的情況下,WEB服務(wù)器還要能夠與瀏覽器實(shí)現(xiàn)有狀態(tài)的會(huì)話,就必須對(duì)所有能被客戶端訪問(wèn)的請(qǐng)求路徑(包括超鏈接、form表單的action屬性設(shè)置和重定向的URL)進(jìn)行URL重寫。
Cookie和Session的區(qū)別
session和cookies同樣都是針對(duì)單獨(dú)用戶的變量(或者說(shuō)是對(duì)象好像更合適點(diǎn)),不同的用戶在訪問(wèn)網(wǎng)站的時(shí)候都會(huì)擁有各自的session或者cookies,不同用戶之間互不干擾。
他們的不同點(diǎn)是:
1,存儲(chǔ)位置不同
session在服務(wù)器端存儲(chǔ),比較安全,但是如果session較多則會(huì)影響性能
cookies在客戶端存儲(chǔ),存在較大的安全隱患
2,生命周期不同
session生命周期在指定的時(shí)間(如20分鐘) 到了之后會(huì)結(jié)束,不到指定的時(shí)間,也會(huì)隨著瀏覽器進(jìn)程的結(jié)束而結(jié)束。
cookies默認(rèn)情況下也隨著瀏覽器進(jìn)程結(jié)束而結(jié)束,但如果手動(dòng)指定時(shí)間,則不受瀏覽器進(jìn)程結(jié)束的影響。
總結(jié):簡(jiǎn)而言之,兩者都是保存了用戶操作的歷史信息,但是存在的地方不同;而且session和cookie的目的相同,都是為了克服HTTP協(xié)議無(wú)狀態(tài)的缺陷,但是完成方法不同。Session通過(guò)cookie在客戶端保存session id,將用戶的其他會(huì)話消息保存在服務(wù)端的session對(duì)象中;而cookie需要將所有信息都保存在客戶端,因此存在著一定的安全隱患,例如本地Cookie中可能保存著用戶名和密碼,容易泄露。
————————————————
版權(quán)聲明:本文為CSDN博主「悲觀的樂(lè)觀主義者」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43997530/article/details/105650267
藍(lán)藍(lán)設(shè)計(jì)的小編 http://www.wnxcall.com