Cookie和Session
一域蜗、會(huì)話技術(shù)
?
問(wèn)題引入:一個(gè)購(gòu)物網(wǎng)站系統(tǒng)(比如:淘寶網(wǎng))似炎,用戶都會(huì)把想要購(gòu)買的物品放到購(gòu)物車中队魏,你會(huì)發(fā)現(xiàn)用戶一旦放入購(gòu)物車,無(wú)論用戶點(diǎn)擊到那一個(gè)頁(yè)面添加到購(gòu)物車的商品都能看到(有的網(wǎng)站不登陸也能查看購(gòu)物車信息)棱诱,那么這個(gè)是怎么實(shí)現(xiàn)的呢?
因?yàn)镠ttp協(xié)議是無(wú)狀態(tài)的(沒(méi)有記憶功能秘噪,提高了傳輸效率),也就是說(shuō)每個(gè)客戶訪問(wèn)服務(wù)器端資源時(shí)勉耀,服務(wù)器并不知道該客戶端是誰(shuí)缆娃,所以要完成上面的要求就必須要使用會(huì)話技術(shù)了。
1.?什么是會(huì)話技術(shù)
會(huì)話技術(shù)指的是當(dāng)一個(gè)瀏覽器與服務(wù)器在進(jìn)行對(duì)話的期間(即瀏覽器沒(méi)有關(guān)閉)瑰排,各個(gè)請(qǐng)求不同的頁(yè)面間可以共享數(shù)據(jù)贯要,這種技術(shù)就稱之為會(huì)話技術(shù)。
從瀏覽器請(qǐng)求某個(gè)網(wǎng)站椭住,直到瀏覽器關(guān)閉崇渗,稱為一次會(huì)話。會(huì)話技術(shù)就是解決用戶數(shù)據(jù)的保存問(wèn)題京郑。
2 .?會(huì)話技術(shù)分類
?? 會(huì)話技術(shù)主要分為Cookie和Session兩種技術(shù)宅广;
Cookie:數(shù)據(jù)存儲(chǔ)在客戶端本地(此處我們是瀏覽器上),減少服務(wù)器端的存儲(chǔ)的壓力些举,安全性不好跟狱,客戶端可以清除cookie;
Session:將數(shù)據(jù)存儲(chǔ)到服務(wù)器端户魏,安全性相對(duì)好驶臊,增加服務(wù)器的壓力;
二叼丑、Cookie技術(shù)
Cookie技術(shù)是將用戶的數(shù)據(jù)存儲(chǔ)到客戶端的技術(shù)关翎,我們分為兩方面學(xué)習(xí):
?? 第一,服務(wù)器端怎樣將一個(gè)Cookie發(fā)送到客戶端鸠信;
?? 第二纵寝,服務(wù)器端怎樣接受客戶端攜帶的Cookie;
1.?服務(wù)器端向客戶端發(fā)送一個(gè)Cookie
?1)創(chuàng)建Cookie
Cookie cookie = new Cookie(String cookieName,String cookieValue);
示例:
Cookie cookie = new Cookie("username"星立,"zhangsan");
resp.addCookie(cookie);
那么該cookie會(huì)以響應(yīng)頭的形式發(fā)送給客戶端爽茴。
?注意:Cookie中存儲(chǔ)中文時(shí)葬凳,放入cookie要使用URLEncoder.encode進(jìn)行編碼,獲取cookie時(shí)要通過(guò)URLDecoder.decode進(jìn)行解碼出來(lái)室奏,不然會(huì)出現(xiàn)亂碼問(wèn)題沮明。
2)設(shè)置Cookie在客戶端的持久化時(shí)間
cookie.setMaxAge(int seconds);?---時(shí)間秒
注意:如果不設(shè)置持久化時(shí)間,cookie會(huì)存儲(chǔ)在瀏覽器的內(nèi)存中窍奋,瀏覽器關(guān)閉cookie信息銷毀(會(huì)話級(jí)別的cookie)荐健,如果設(shè)置持久化時(shí)間,cookie信息會(huì)被持久化到瀏覽器的磁盤文件里琳袄。
示例:
cookie.setMaxAge(10*60);
設(shè)置cookie信息在瀏覽器的磁盤文件中存儲(chǔ)的時(shí)間是10分鐘江场,過(guò)期瀏覽器自動(dòng)刪除該cookie信息
3)設(shè)置Cookie的攜帶路徑
cookie.setPath(String path);
注意:如果不設(shè)置攜帶路徑,那么該cookie信息會(huì)在訪問(wèn)產(chǎn)生該cookie的web資源所在的路徑都攜帶cookie信息
示例:
cookie.setPath("/WEB16");
代表訪問(wèn)WEB16應(yīng)用中的任何資源都攜帶cookie
cookie.setPath("/WEB16/cookieServlet");
代表訪問(wèn)WEB16中的cookieServlet時(shí)才攜帶cookie信息
4)向客戶端發(fā)送cookie
response.addCookie(Cookie cookie);
5)刪除客戶端的cookie:
setMaxAge(0);
注意:只是刪除本地cookie文件窖逗,瀏覽器還有緩存址否,需要關(guān)閉瀏覽器再打開;
2.?服務(wù)器端怎么接受客戶端攜帶的Cookie
cookie信息是以請(qǐng)求頭的方式發(fā)送到服務(wù)器端的碎紊。
1)通過(guò)request獲得所有的Cookie:
Cookie[] cookies = request.getCookies();
2)遍歷Cookie數(shù)組佑附,通過(guò)Cookie的名稱獲得我們想要的Cookie
for(Cookie cookie : cookies){
if(cookie.getName().equal(cookieName)){
String cookieValue = cookie.getValue();
}
}
三、Session介紹
Session技術(shù)是將數(shù)據(jù)存儲(chǔ)在服務(wù)器端的技術(shù)仗考,會(huì)為每個(gè)客戶端都創(chuàng)建一塊內(nèi)存空間存儲(chǔ)客戶的數(shù)據(jù)音同,但客戶端需要每次都攜帶一個(gè)標(biāo)識(shí)ID去服務(wù)器中尋找屬于自己的內(nèi)存空間。Session的實(shí)現(xiàn)是基于Cookie秃嗜,Session需要借助于Cookie存儲(chǔ)客戶的唯一性標(biāo)識(shí)JSESSIONID权均;
使用Session即就要思考下面三個(gè)問(wèn)題:
怎樣獲得屬于本客戶端的session對(duì)象(內(nèi)存區(qū)域)?
怎樣向session中存取數(shù)據(jù)(session也是一個(gè)域?qū)ο螅?/p>
session對(duì)象的生命周期是怎么樣的锅锨?
四叽赊、Session的使用
1.獲得Session對(duì)象
HttpSession session = request.getSession();
此方法會(huì)獲得專屬于當(dāng)前會(huì)話的Session對(duì)象,如果服務(wù)器端沒(méi)有該會(huì)話的Session對(duì)象會(huì)創(chuàng)建一個(gè)新的Session返回必搞,如果已經(jīng)有了屬于該會(huì)話的Session直接將已有的Session返回(實(shí)質(zhì)就是根據(jù)JSESSIONID判斷該客戶端是否在服務(wù)器上已經(jīng)存在session了)必指;
Session一旦創(chuàng)建會(huì)自動(dòng)創(chuàng)建一個(gè)對(duì)應(yīng)的JSEESIONID,存儲(chǔ)在Cookie中恕洲;
JSEESIONID與Session的關(guān)系:
鑰匙(或密碼)與銀行保險(xiǎn)箱塔橡,鑰匙(或密碼)在客戶端,保險(xiǎn)箱在服務(wù)器端?;
2.怎樣向session中存取數(shù)據(jù)(session也是一個(gè)域?qū)ο螅?/b>
Session也是存儲(chǔ)數(shù)據(jù)的區(qū)域?qū)ο笱新拢詓ession對(duì)象也具有如下三個(gè)方法:
setAttribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);
3.Session對(duì)象的生命周期
(1). Session的創(chuàng)建
第一次執(zhí)行request.getSession()時(shí)創(chuàng)建
(2). Session的銷毀:
1)服務(wù)器(非正常)關(guān)閉時(shí)
2)過(guò)期/失效(默認(rèn)失效時(shí)間30分鐘)
session的過(guò)期時(shí)間是從什么時(shí)候開始計(jì)算的谱邪?
從Session不活動(dòng)開始計(jì)時(shí);
即沒(méi)有任何的跟服務(wù)器頁(yè)面或者Servlet交互了;
?方法一:可以通過(guò)代碼設(shè)置Session的失效:
?session.setMaxInactiveInterval(100);?? ??? ??? ???
?方法二:?在工程的web.xml中進(jìn)行配置
<session-config>
???? ???<session-timeout>30</session-timeout>
</session-config>
分鐘
Timeout設(shè)置成0或者負(fù)數(shù)表示Session永久有效庶诡;
方法三:直接在應(yīng)用服務(wù)器中設(shè)置,如果是tomcat咆课,可以在tomcat目錄下
conf/web.xml中找到<session-config>元素末誓,tomcat默認(rèn)設(shè)置是30分鐘扯俱,
只要修改這個(gè)值就可以了
企業(yè)中一般Session的有效期是一周
3)手動(dòng)銷毀session
session.invalidate();
作用范圍:
默認(rèn)在一次會(huì)話中,也就是說(shuō)在喇澡,一次會(huì)話中任何資源公用一個(gè)session對(duì)象 迅栅。
4.?如何判斷Session是否過(guò)期
getSession(boolean create);
API說(shuō)明: 返回與此請(qǐng)求關(guān)聯(lián)的當(dāng)前?HttpSession,如果沒(méi)有當(dāng)前會(huì)話并且?create?為 true晴玖,則??? ?? 返回一個(gè)新會(huì)話读存。 如果?create?為?false?并且該請(qǐng)求沒(méi)有有效的?HttpSession,則此方法返回
null呕屎。
??? ??? 由API說(shuō)明可知让簿,通過(guò)以下方式可以知道Session是否過(guò)期:
if(request.getSession(false)==null){??
???System.out.println("Session?has?been?invalidated!");??
}else{??
??? System.out.println("Session?is?active!");??
}?
特殊情況:第一次訪問(wèn)時(shí)候也是null,因?yàn)榈谝淮沃斑€沒(méi)有創(chuàng)建Session秀睛;
三尔当、Session和Cookie的區(qū)別
?
1 .存取方式的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二進(jìn)制數(shù)據(jù)蹂安,需求先進(jìn)行編碼椭迎。? Cookie中也不能直接存取Java對(duì)象。若要存儲(chǔ)略微復(fù)雜的信息田盈,運(yùn)用Cookie是比擬艱難的畜号。
而Session中能夠存取任何類型的數(shù)據(jù),包括而不限于String允瞧、Integer弄兜、List、Map等瓷式。Session? 中也能夠直接保管Java Bean乃至任何Java類替饿,對(duì)象等,運(yùn)用起來(lái)十分便當(dāng)贸典。能夠把Session看做是 一個(gè)Java容器類视卢。
?2 .隱私策略的不同
Cookie存儲(chǔ)在客戶端閱讀器中,對(duì)客戶端是可見(jiàn)的廊驼,客戶端的一些程序可能會(huì)窺探据过、復(fù)制以至修正 Cookie中的內(nèi)容。而Session存儲(chǔ)在服務(wù)器上妒挎,對(duì)客戶端是透明的绳锅,不存在敏感信息泄露的風(fēng)險(xiǎn)。
假如選用Cookie酝掩,比較好的方法是鳞芙,敏感的信息如賬號(hào)密碼等盡量不要寫到Cookie中。最好是像?? Google、Baidu那樣將Cookie信息加密原朝,提交到服務(wù)器后再進(jìn)行解密驯嘱,保證Cookie中的信息只要本人? 能讀得懂。而假如選擇Session就省事多了喳坠,反正是放在服務(wù)器上鞠评,Session里任何隱私都能夠有效的?? 保護(hù)。
?3.有效期上的不同
使用過(guò)Google的人都曉得壕鹉,假如登錄過(guò)Google剃幌,則Google的登錄信息長(zhǎng)期有效。用戶不用每次訪問(wèn)?? 都重新登錄晾浴,Google會(huì)持久地記載該用戶的登錄信息负乡。要到達(dá)這種效果,運(yùn)用Cookie會(huì)是比較好的選?? 擇怠肋。只需要設(shè)置Cookie的過(guò)期時(shí)間屬性為一個(gè)很大很大的數(shù)字敬鬓。
由于Session依賴于名為JSESSIONID的Cookie,而Cookie JSESSIONID的過(guò)期時(shí)間默許為–1笙各,只需??? 關(guān)閉了閱讀器該Session就會(huì)失效钉答,因而Session不能完成信息永世有效的效果。運(yùn)用URL地址重寫? 也不能完成杈抢。而且假如設(shè)置Session的超時(shí)時(shí)間過(guò)長(zhǎng)数尿,服務(wù)器累計(jì)的Session就會(huì)越多,越容易招致 內(nèi)存溢出惶楼。
?4.服務(wù)器壓力的不同
Session是保管在服務(wù)器端的右蹦,每個(gè)用戶都會(huì)產(chǎn)生一個(gè)Session。假如并發(fā)訪問(wèn)的用戶十分多歼捐,會(huì)產(chǎn)生?? 十分多的Session何陆,耗費(fèi)大量的內(nèi)存。因而像Google豹储、Baidu贷盲、Sina這樣并發(fā)訪問(wèn)量極高的網(wǎng)站,是不?? 太可能運(yùn)用Session來(lái)追蹤客戶會(huì)話的剥扣。
而Cookie保管在客戶端巩剖,不占用服務(wù)器資源。假如并發(fā)閱讀的用戶十分多钠怯,Cookie是很好的選擇佳魔。關(guān)?? 于Google、Baidu晦炊、Sina來(lái)說(shuō)鞠鲜,Cookie或許是唯一的選擇宁脊。
?5 .瀏覽器支持的不同
Cookie是需要客戶端瀏覽器支持的。假如客戶端禁用了Cookie镊尺,或者不支持Cookie朦佩,則會(huì)話跟蹤會(huì)失?? 效并思。關(guān)于WAP上的應(yīng)用庐氮,常規(guī)的Cookie就派不上用場(chǎng)了。
假如客戶端瀏覽器不支持Cookie宋彼,需要運(yùn)用Session以及URL地址重寫弄砍。需要注意的是一切的用到 Session程序的URL都要進(jìn)行URL地址重寫,否則Session會(huì)話跟蹤還會(huì)失效输涕。關(guān)于WAP應(yīng)用來(lái)說(shuō)音婶,?? Session+URL地址重寫或許是它唯一的選擇。
假如客戶端支持Cookie莱坎,則Cookie既能夠設(shè)為本瀏覽器窗口以及子窗口內(nèi)有效(把過(guò)期時(shí)間設(shè)為–1)衣式, 也能夠設(shè)為一切閱讀器窗口內(nèi)有效(把過(guò)期時(shí)間設(shè)為某個(gè)大于0的整數(shù))。但Session只能在本閱讀?? 器窗口以及其子窗口內(nèi)有效檐什。假如兩個(gè)瀏覽器窗口互不相干碴卧,它們將運(yùn)用兩個(gè)不同的Session。(IE8?? 下不同窗口Session相干)
?6.跨域支持上的不同
Cookie支持跨域名訪問(wèn)乃正,例如將domain屬性設(shè)置為“.biaodianfu.com”住册,則以“.biaodianfu.com”??? 為后綴的一切域名均能夠訪問(wèn)該Cookie∥途撸跨域名Cookie如今被普遍用在網(wǎng)絡(luò)中荧飞,例如Google、Baidu名党、?? Sina等叹阔。而Session則不會(huì)支持跨域名訪問(wèn)。Session僅在他所在的域名內(nèi)有效传睹。
僅運(yùn)用Cookie或者僅運(yùn)用Session可能完成不了理想的效果耳幢。這時(shí)應(yīng)該嘗試一下同時(shí)運(yùn)用Cookie與 Session。Cookie與Session的搭配運(yùn)用在實(shí)踐項(xiàng)目中會(huì)完成很多意想不到的效果蒋歌。
需要獲取海量最新BATJ視頻資料加群:676279635 備注(簡(jiǎn)書)