Java架構(gòu)實(shí)踐-session和cookie的區(qū)別?

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)書)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帅掘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子堂油,更是在濱河造成了極大的恐慌修档,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件府框,死亡現(xiàn)場(chǎng)離奇詭異吱窝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門院峡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兴使,“玉大人,你說(shuō)我怎么就攤上這事照激》⑵牵” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵俩垃,是天一觀的道長(zhǎng)励幼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)口柳,這世上最難降的妖魔是什么苹粟? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮跃闹,結(jié)果婚禮上嵌削,老公的妹妹穿的比我還像新娘。我一直安慰自己望艺,他們只是感情好苛秕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荣茫,像睡著了一般想帅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啡莉,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天港准,我揣著相機(jī)與錄音,去河邊找鬼咧欣。 笑死浅缸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的魄咕。 我是一名探鬼主播衩椒,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哮兰!你這毒婦竟也來(lái)了毛萌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喝滞,失蹤者是張志新(化名)和其女友劉穎阁将,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體右遭,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡做盅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年缤削,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吹榴。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亭敢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出图筹,到底是詐尸還是另有隱情帅刀,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布婿斥,位于F島的核電站劝篷,受9級(jí)特大地震影響哨鸭,放射性物質(zhì)發(fā)生泄漏民宿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一像鸡、第九天 我趴在偏房一處隱蔽的房頂上張望活鹰。 院中可真熱鬧,春花似錦只估、人聲如沸志群。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锌云。三九已至,卻和暖如春吁脱,著一層夾襖步出監(jiān)牢的瞬間桑涎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工兼贡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留攻冷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓遍希,卻偏偏與公主長(zhǎng)得像等曼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凿蒜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容