歡迎關(guān)注公眾號(hào):程序員面試經(jīng)驗(yàn)分享(jobbible)
問題:SESSION與COOKIE的區(qū)別渔扎?
1、cookie數(shù)據(jù)存放在客戶的瀏覽器上信轿,session數(shù)據(jù)放在服務(wù)器上晃痴。
2残吩、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙
?? 考慮到安全應(yīng)當(dāng)使用session倘核。
3泣侮、cookie 是一種發(fā)送到客戶瀏覽器的文本串句柄,并保存在客戶機(jī)硬盤上紧唱,可以用來在某個(gè)WEB站點(diǎn)會(huì)話間持久的保持?jǐn)?shù)據(jù)活尊。
4、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上漏益。當(dāng)訪問增多蛹锰,會(huì)比較占用你服務(wù)器的性能
?? 考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE绰疤。
5铜犬、單個(gè)cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie轻庆。
6癣猾、session其實(shí)指的就是訪問者從到達(dá)某個(gè)特定主頁到離開為止的那段時(shí)間。?Session其實(shí)是利用Cookie進(jìn)行信息處理的余爆,當(dāng)用戶首先進(jìn)行了請(qǐng)求后纷宇,服務(wù)端就在用戶瀏覽器上創(chuàng)建了一個(gè)Cookie,當(dāng)這個(gè)Session結(jié)束時(shí)蛾方,其實(shí)就是意味著這個(gè)Cookie就過期了呐粘。
注:為這個(gè)用戶創(chuàng)建的Cookie的名稱是aspsessionid。這個(gè)Cookie的唯一目的就是為每一個(gè)用戶提供不同的身份認(rèn)證转捕。
7作岖、cookie和session的共同之處在于:cookie和session都是用來跟蹤瀏覽器用戶身份的會(huì)話方式。
session詳解
1五芝、Session什么時(shí)候失效痘儡?
a. 服務(wù)器會(huì)把長(zhǎng)時(shí)間沒有活動(dòng)的Session從服務(wù)器內(nèi)存中清除,此時(shí)Session便失效枢步。
b. 調(diào)用Session的invalidate方法沉删。
2、Session對(duì)瀏覽器的要求:
雖然Session保存在服務(wù)器醉途,對(duì)客戶端是透明的矾瑰,它的正常運(yùn)行仍然需要客戶端瀏覽器的支持。這是因?yàn)镾ession需要使用Cookie作為識(shí)別標(biāo)志隘擎。HTTP協(xié)議是無狀態(tài)的殴穴,Session不能依據(jù)HTTP連接來判斷是否為同一客戶,因此服務(wù)器向客戶端瀏覽器發(fā)送一個(gè)名為JSESSIONID的Cookie,它的值為該Session的id(也就是HttpSession.getId()的返回值)采幌。Session依據(jù)該Cookie來識(shí)別是否為同一用戶劲够。
該Cookie為服務(wù)器自動(dòng)生成的,它的maxAge屬性一般為-1休傍,表示僅當(dāng)前瀏覽器內(nèi)有效征绎,并且各瀏覽器窗口間不共享,關(guān)閉瀏覽器就會(huì)失效磨取。因此同一機(jī)器的兩個(gè)瀏覽器窗口訪問服務(wù)器時(shí)人柿,會(huì)生成兩個(gè)不同的Session。但是由瀏覽器窗口內(nèi)的鏈接忙厌、腳本等打開的新窗口(也就是說不是雙擊桌面瀏覽器圖標(biāo)等打開的窗口)除外凫岖。這類子窗口會(huì)共享父窗口的Cookie,因此會(huì)共享一個(gè)Session慰毅。
注意:新開的瀏覽器窗口會(huì)生成新的Session隘截,但子窗口除外。子窗口會(huì)共用父窗口的Session汹胃。例如婶芭,在鏈接上右擊,在彈出的快捷菜單中選擇"在新窗口中打開"時(shí)着饥,子窗口便可以訪問父窗口的Session犀农。
?如果客戶端瀏覽器將Cookie功能禁用,或者不支持Cookie怎么辦宰掉?例如呵哨,絕大多數(shù)的手機(jī)瀏覽器都不支持Cookie。Java Web提供了另一種解決方案:URL地址重寫轨奄。
URL地址重寫是對(duì)客戶端不支持Cookie的解決方案孟害。URL地址重寫的原理是將該用戶Session的id信息重寫到URL地址中。服務(wù)器能夠解析重寫后的URL獲取Session的id挪拟。這樣即使客戶端不支持Cookie挨务,也可以使用Session來記錄用戶狀態(tài)。HttpServletResponse類提供了encodeURL(String url)實(shí)現(xiàn)URL地址重寫玉组,該方法會(huì)自動(dòng)判斷客戶端是否支持Cookie谎柄。如果客戶端支持Cookie,會(huì)將URL原封不動(dòng)地輸出來惯雳。如果客戶端不支持Cookie朝巫,則會(huì)將用戶Session的id重寫到URL中。
注意:TOMCAT判斷客戶端瀏覽器是否支持Cookie的依據(jù)是請(qǐng)求中是否含有Cookie石景。盡管客戶端可能會(huì)支持Cookie劈猿,但是由于第一次請(qǐng)求時(shí)不會(huì)攜帶任何Cookie(因?yàn)椴o任何Cookie可以攜帶)拙吉,URL地址重寫后的地址中仍然會(huì)帶有jsessionid。當(dāng)?shù)诙卧L問時(shí)服務(wù)器已經(jīng)在瀏覽器中寫入Cookie了糙臼,因此URL地址重寫后的地址中就不會(huì)帶有jsessionid了庐镐。
Cookie詳解
Cookie總是保存在客戶端中恩商,按在客戶端中的存儲(chǔ)位置变逃,可分為內(nèi)存Cookie和硬盤Cookie。
內(nèi)存Cookie由瀏覽器維護(hù)怠堪,保存在內(nèi)存中揽乱,瀏覽器關(guān)閉后就消失了,其存在時(shí)間是短暫的粟矿。硬盤Cookie保存在硬盤里凰棉,有一個(gè)過期時(shí)間,除非用戶手工清理或到了過期時(shí)間陌粹,硬盤Cookie不會(huì)被刪除撒犀,其存在時(shí)間是長(zhǎng)期的。所以掏秩,按存在時(shí)間或舞,可分為非持久Cookie和持久Cookie。
1蒙幻、用途
因?yàn)镠TTP協(xié)議是無狀態(tài)的映凳,即服務(wù)器不知道用戶上一次做了什么,這嚴(yán)重阻礙了交互式Web應(yīng)用程序的實(shí)現(xiàn)邮破。在典型的網(wǎng)上購物場(chǎng)景中诈豌,用戶瀏覽了幾個(gè)頁面,買了一盒餅干和兩瓶飲料抒和。最后結(jié)帳時(shí)矫渔,由于HTTP的無狀態(tài)性,不通過額外的手段摧莽,服務(wù)器并不知道用戶到底買了什么擦耀。所以Cookie就是用來繞開HTTP的無狀態(tài)性的“額外手段”之一。服務(wù)器可以設(shè)置或讀取Cookies中包含信息掏颊,借此維護(hù)用戶跟服務(wù)器會(huì)話中的狀態(tài)普碎。
在剛才的購物場(chǎng)景中,當(dāng)用戶選購了第一項(xiàng)商品丑蛤,服務(wù)器在向用戶發(fā)送網(wǎng)頁的同時(shí)叠聋,還發(fā)送了一段Cookie,記錄著那項(xiàng)商品的信息受裹。當(dāng)用戶訪問另一個(gè)頁面碌补,瀏覽器會(huì)把Cookie發(fā)送給服務(wù)器虏束,于是服務(wù)器知道他之前選購了什么。用戶繼續(xù)選購飲料厦章,服務(wù)器就在原來那段Cookie里追加新的商品信息镇匀。結(jié)帳時(shí),服務(wù)器讀取發(fā)送來的Cookie就行了袜啃。
Cookie另一個(gè)典型的應(yīng)用是當(dāng)?shù)卿浺粋€(gè)網(wǎng)站時(shí)汗侵,網(wǎng)站往往會(huì)請(qǐng)求用戶輸入用戶名和密碼,并且用戶可以勾選“下次自動(dòng)登錄”群发。如果勾選了晰韵,那么下次訪問同一網(wǎng)站時(shí),用戶會(huì)發(fā)現(xiàn)沒輸入用戶名和密碼就已經(jīng)登錄了熟妓。這正是因?yàn)榍耙淮蔚卿洉r(shí)雪猪,服務(wù)器發(fā)送了包含登錄憑據(jù)(用戶名加密碼的某種加密形式)的Cookie到用戶的硬盤上。第二次登錄時(shí)起愈,(如果該Cookie尚未到期)瀏覽器會(huì)發(fā)送該Cookie只恨,服務(wù)器驗(yàn)證憑據(jù),于是不必輸入用戶名和密碼就讓用戶登錄了抬虽。
2官觅、Cookie的缺陷
? ?a. cookie會(huì)被附加在每個(gè)HTTP請(qǐng)求中,所以無形中增加了流量斥赋。
? ?b. 由于在HTTP請(qǐng)求中的cookie是明文傳遞的缰猴,所以安全性成問題。(除非用HTTPS)
? ?c. Cookie的大小限制在4KB左右疤剑。對(duì)于復(fù)雜的存儲(chǔ)需求來說是不夠用的滑绒。[2]
3、使用和禁用Cookies
用戶可以改變?yōu)g覽器的設(shè)置隘膘,以使用或者禁用Cookies疑故。同時(shí)一些瀏覽器自帶或安裝開發(fā)者工具包允許用戶查看,修改或刪除特定網(wǎng)站的Cookies信息弯菊。
4纵势、識(shí)別功能
如果在一臺(tái)計(jì)算機(jī)中安裝多個(gè)瀏覽器,每個(gè)瀏覽器都會(huì)以獨(dú)立的空間存放cookie管钳。因?yàn)閏ookie中不但可以確認(rèn)用戶钦铁,還能包含計(jì)算機(jī)和瀏覽器的信息,所以一個(gè)用戶用不同的瀏覽器登錄或者用不同的計(jì)算機(jī)登錄才漆,都會(huì)得到不同的cookie信息牛曹,另一方面,對(duì)于在同一臺(tái)計(jì)算機(jī)上使用同一瀏覽器的多用戶群醇滥,cookie不會(huì)區(qū)分他們的身份黎比,除非他們使用不同的用戶名登錄超营。
5、隱私阅虫,安全和廣告
Cookies在某種程度上說已經(jīng)嚴(yán)重危及用戶的隱私和安全演闭。其中的一種方法是:一些公司的高層人員為了某種目的(譬如市場(chǎng)調(diào)研)而訪問了從未去過的網(wǎng)站(通過搜索引擎查到的),而這些網(wǎng)站包含了一種叫做網(wǎng)頁臭蟲的圖片颓帝,該圖片透明米碰,且只有一個(gè)象素大小(以便隱藏)躲履,它們的作用是將所有訪問過此頁面的計(jì)算機(jī)寫入cookie见间。而后聊闯,電子商務(wù)網(wǎng)站將讀取這些cookie信息工猜,并尋找寫入這些cookie的網(wǎng)站,隨即發(fā)送包含了針對(duì)這個(gè)網(wǎng)站的相關(guān)產(chǎn)品廣告的垃圾郵件給這些高級(jí)人員菱蔬。
6篷帅、Cookies的替代品
鑒于cookie的局限和反對(duì)者的聲音,有如下一些替代方法:
Brownie方案拴泌,是一項(xiàng)開放源代碼工程魏身,由SourceForge發(fā)起。Brownie曾被用以共享在不同域中的接入蚪腐,而cookies則被構(gòu)想成單一域中的接入箭昵。這項(xiàng)方案已經(jīng)停止開發(fā)。
P3P回季,用以讓用戶獲得更多控制個(gè)人隱私權(quán)利的協(xié)議家制。在瀏覽網(wǎng)站時(shí),它類似于cookie泡一。
在與服務(wù)器傳輸數(shù)據(jù)時(shí)颤殴,通過在地址后面添加唯一查詢串,讓服務(wù)器識(shí)別是否合法用戶鼻忠,也可以避免使用cookie涵但。
●一文看懂 MySQL 高性能優(yōu)化技巧實(shí)踐
============================================================
歡迎關(guān)注公眾號(hào):程序員面試經(jīng)驗(yàn)分享(jobbible)