相關(guān)視頻:v.qq.com/x/page/f0513vvyti4.html
PPT:ptteng.github.io/PPT/PPT/java-05%20cookie&session.html#/
一個小例子:
星巴克開始優(yōu)惠活動,每消費(fèi)10杯咖啡,會免費(fèi)贈送1杯。考慮到一個人一次性消費(fèi)10杯咖啡幾乎不可能,所以需要采取某種方式來記錄顧客的消費(fèi)數(shù)量。
解決方案:
1,店員很厲害,每個顧客的消費(fèi)記錄都記得一清二楚;
2,分給顧客一張卡片,每消費(fèi)一次記錄一次;
3,發(fā)給顧客一張卡片,上面有卡號,顧客每消費(fèi)一次,由店員在操作機(jī)上記錄一次。
從生活上來看,方案一的可執(zhí)行性幾乎為0,方案二和方案三我們都見過。
而方案二和三正是對應(yīng)的客戶端記錄和服務(wù)端記錄。與之相對應(yīng)的正式cookie和session。
好了,我們進(jìn)入正題。
我們知道HTTP協(xié)議是一種無狀態(tài)的協(xié)議,數(shù)據(jù)一旦交換完畢,客戶端與服務(wù)端的連接就會關(guān)閉,再次交換數(shù)據(jù)需要重新建立連接。而我們有時(shí)候又有跟蹤會話的需求,所以必須引入一種機(jī)制:cookie。
什么是cookie?
cookie是一小段文本信息,它記錄了一個用戶訪問某個網(wǎng)站時(shí)的用戶信息。
cookie機(jī)制
cookie機(jī)制其實(shí)在前面已經(jīng)說了,但cookie需要解決三個問題:分發(fā)、內(nèi)容和使用。
cookie的分發(fā)是通過擴(kuò)展HTTP協(xié)議來實(shí)現(xiàn)的,服務(wù)器端通過在HTTP的響應(yīng)由中加上一行特殊的指示以提示瀏覽器按照指示生成相應(yīng)的cookie。
cookie的內(nèi)容主要包括名字、值、過期時(shí)間、路徑和域。
cookie的使用是由瀏覽器按照一定的原則在后臺自動發(fā)送給服務(wù)器。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍大于等于將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發(fā)送給服務(wù)器。
cookie屬性
name:cookie的名字,一旦創(chuàng)建,名稱不可更改。
value:cookie的值,如果值為Unicode字符,需要為字符編碼。如果為二進(jìn)制數(shù)據(jù),則需要使用BASE64編碼。
maxAge:cookie失效時(shí)間,單位秒。如果為正數(shù),則該cookie在maxAge后失效。如果為負(fù)數(shù),該cookie為臨時(shí)cookie,關(guān)閉瀏覽器即失效,瀏覽器也不會以任何形式保存該cookie。如果為0,表示刪除該cookie。默認(rèn)為-1。
secure:該cookie是否僅被使用安全協(xié)議傳輸。
path:該cookie的使用路徑。如果設(shè)置為"/sessionWeb/",則只有ContextPath為“/sessionWeb/”的程序可以訪問該cookie。如果設(shè)置為“/”,則本域名下ContextPath都可以訪問該cookie。
session機(jī)制
session機(jī)制是一種服務(wù)端的機(jī)制,服務(wù)器使用一種類似散列表的結(jié)構(gòu)來保存信息。
當(dāng)程序需要為某個客戶端的請求創(chuàng)建一個session的時(shí)候,服務(wù)器首先檢查這個客戶端里的請求里是否已包含了一個session標(biāo)識--sessionID,如果已經(jīng)包含一個sessionID,則說明以前已經(jīng)為此客戶端創(chuàng)建過session,服務(wù)器就按照sessionID把這個session檢索出來使用(檢索不到,可能會新建一個),如果客戶端請求不包含sessionID,則為此客戶端創(chuàng)建一個session并且聲稱一個與此session相關(guān)聯(lián)的sessionID,sessionID的值應(yīng)該是一個既不會重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個sessionID將被在本次響應(yīng)中返回給客戶端保存。
保存sessionID的方式
1,使用cookie:一般這個cookie的名字都是類似于XSESSIONID
? ? ? 如:JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764 ---名字就是JSESSIONID
2,URL重寫:因?yàn)閏ookie可以被人為禁止,所以為了保證sessionID能夠被傳遞給服務(wù)器,使用URL重寫也是一種解決方法。
如:
http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
兩種寫法都行。
session、cookie的區(qū)別
1,cookie數(shù)據(jù)存放在客戶的瀏覽器(本地),session數(shù)據(jù)放在服務(wù)器上;
2,cookie不是很安全,別人可以分析存放在本地的cookie并進(jìn)行cookie欺騙,考慮到安全應(yīng)當(dāng)使用session;
3,session會在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能,考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用cookie;
4,單個cookie保存的數(shù)據(jù)不能超過4k,很多瀏覽器都限制一個站點(diǎn)最多保存20個cookie;
5,可以將的呢輪轂信息等重要信息存放為session。
--------------------------------------------------------------------------------------------------------------------
技能樹.IT修真院
“我們相信人人都可以成為一個工程師,現(xiàn)在開始,找個師兄,帶你入門,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷茫”。
這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線,學(xué)習(xí)透明化,成長可見化,師兄1對1免費(fèi)指導(dǎo)。快來與我一起學(xué)習(xí)吧~ 點(diǎn)擊此鏈接:http://www.jnshu.com/login/1/10014595