1.Cookie
1.1 Cookie機制
cookie是服務(wù)器生成,客戶端保存的一小段(最大3k)文本文件锹锰。當(dāng)客戶端首次通過HTTP訪問服務(wù)的時候摊阀,服務(wù)端會生成Cookie,然后客戶端(瀏覽器)會保存本Cookie恶座,下次訪問服務(wù)端的時候會在請求頭帶上這個Cookie便脊,從而實現(xiàn)了服務(wù)端和客戶端的數(shù)據(jù)交換和數(shù)據(jù)校驗蚂四。Cookie彌補了HTTP是無狀態(tài)協(xié)議特性的天然缺陷,一個Cookie從生成到發(fā)送的過程如圖:
但是哪痰,由于HTTP協(xié)議不僅是無狀態(tài)的遂赠,且是不安全的,因此可以把Cookie的secure設(shè)置為yes晌杰,但是secure屬性并不能對Cookie內(nèi)容加密跷睦,因而不能保證絕對的安全性。如果需要高安全性肋演,需要在程序中對Cookie內(nèi)容加密送讲、解密,以防泄密惋啃。
1.2Cookie特性
- Cookie是不可以跨域名訪問的,有了這個特性保證了用戶信息的基本安全监右。每個Cookie可以理解成是每個域名(當(dāng)然域名也分為一級边灭、二級等)訪問的通行證,為了保證數(shù)據(jù)不錯亂和數(shù)據(jù)信息安全健盒,每個域名都會相應(yīng)的由服務(wù)器生成獨立的Cookie绒瘦,每個域名只可以操作對應(yīng)域名的Cookie,這里可以在下面理解Cookie的屬性扣癣。
- Cookie中使用中文的話惰帽,需要編碼保存。Cookie中保存中文只能編碼父虑。一般使用UTF-8編碼即可该酗。不推薦使用GBK等中文編碼,因為瀏覽器不一定支持,而且JavaScript也不支持GBK編碼呜魄。
- Cookie可以保存二進制文件悔叽,這一點可操作性比較豐富,比如使用數(shù)字證書爵嗅,或者保存圖片娇澎。但是一般不推薦使用,由于Cookie本身特點睹晒,適合存儲少量信息趟庄。
1.3 Cookie屬性
Cookie的操作在OC中也做了一個OO封裝——NSHTTPCookie,基本滿足日常cookie操作伪很,其常用屬性有以下:
-
NSHTTPCookieName
戚啥,同name,是該Cookie的名稱是掰,Cookie一旦創(chuàng)建變不可修改虑鼎。 -
NSHTTPCookieValue
,同value键痛,該Cookie的值炫彩,如果值為Unicode字符,需要為字符編碼絮短,如果值為二進制數(shù)據(jù)江兢,則需要使用BASE64編碼。 -
NSHTTPCookieOriginURL
丁频,該Cookie的原始URL杉允,通過 Cookie可以追蹤用戶的訪問路徑。 -
NSHTTPCookieVersion
席里,同versiob叔磷,Cookie的版本,0表示遵循Netscape的Cookie規(guī)范奖磁,1表示遵循W3C的RFC 2109規(guī)范改基。 -
NSHTTPCookieDomain
,同domain咖为,Cookie的課訪問的域名秕狰,注意第一個字符必須為‘.’。 -
NSHTTPCookiePath
躁染,同path鸣哀,該Cookie的使用路徑。如果設(shè)置為“/A/”吞彤,則只有contextPath為“/A”的程序可以訪問該Cookie我衬。如果設(shè)置為“/”,則本域名下contextPath都可以訪問該Cookie。注意最后一個字符必須為“/”低飒。 -
NSHTTPCookieSecure
许昨,該Cookie是否僅被使用安全協(xié)議傳輸。安全協(xié)議褥赊。安全協(xié)議有HTTPS糕档,SSL等,在網(wǎng)絡(luò)>上傳輸數(shù)據(jù)之前先將數(shù)據(jù)加密拌喉。默認為false速那。 -
NSHTTPCookieComment
,該Cookie的用處說明尿背。瀏覽器顯示Cookie信息的時候顯示該說明端仰。 -
NSHTTPCookieMaximumAge
,該Cookie失效的時間田藐,單位秒荔烧。如果為正數(shù),則該Cookie在>maxAge秒之后失效汽久。如果為負數(shù)鹤竭,該Cookie為臨時Cookie,關(guān)閉瀏覽器即失效景醇,瀏覽器也不會以任何形式保存該Cookie臀稚。如果為0,表示刪除該Cookie三痰。默認為–1吧寺。
2.Session
2.1 Session機制
Session是另一種記錄客戶狀態(tài)的機制,不同的是Cookie保存在客戶端瀏覽器中散劫,而Session保存在服務(wù)器上稚机。客戶端瀏覽器訪問服務(wù)器的時候获搏,服務(wù)器把客戶端信息以某種形式記錄在服務(wù)器上抒钱。這就是Session⊙湛客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態(tài)就可以了。
如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話仗扬,那么Session機制就是通過檢查服務(wù)器上的“客戶明細表”來確認客戶身份症概。Session相當(dāng)于程序在服務(wù)器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了早芭。
Session由于保存在服務(wù)器彼城,為了快速的操作數(shù)據(jù),一般會把Session放到內(nèi)存中。Session在用戶第一次訪問由服務(wù)器創(chuàng)建募壕,Session生成后调炬,只要用戶繼續(xù)訪問,服務(wù)器就會更新Session舱馅。用戶沒訪問一次服務(wù)器缰泡,服務(wù)器都會對Session進行一次更新。這里可以理解成Session也是有生命周期的代嗤。
2.2 Session特點
Session雖然保存在服務(wù)端棘钞,但是他的正常運行也是許亞哦客戶端支持的,這是因為一般Session的使用需要Cookie作為識別標(biāo)識(當(dāng)然干毅,這種做法很古老宜猜,一般不采用了,因為不知道客戶端是否支持Cookie)硝逢。同一機器的兩個瀏覽器窗口訪問服務(wù)器時姨拥,會生成兩個不同的Session。但是由瀏覽器窗口內(nèi)的鏈接渠鸽、腳本等打開的新窗口(也就是說不是雙擊桌面瀏覽器圖標(biāo)等打開的窗口)除外叫乌。這類子窗口會共享父窗口的Cookie,因此會共享一個Session拱绑。
為了解決客戶端不支持Cookie的問題综芥,一般采用URL地址重寫的方法。具體的就是把Sessionid放到URL的后面或者拼接到URL上面猎拨。
3.Cookie和Session的區(qū)別和聯(lián)系
- cookie數(shù)據(jù)存放在客戶的瀏覽器上膀藐,session數(shù)據(jù)放在服務(wù)器上;
(2)cookie不是很安全红省,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙额各,考慮到安全應(yīng)當(dāng)使用session;
(3)session會在一定時間內(nèi)保存在服務(wù)器上吧恃。當(dāng)訪問增多虾啦,會比較占用你服務(wù)器的性能『墼ⅲ考慮到減輕服務(wù)器性能方面傲醉,應(yīng)當(dāng)使用COOKIE;
(4)單個cookie在客戶端的限制是3K呻率,就是說一個站點在客戶端存放的COOKIE不能超過3K硬毕;
Cookie和Session的方案雖然分別屬于客戶端和服務(wù)端,但是服務(wù)端的session的實現(xiàn)對客戶端的cookie有依賴關(guān)系的礼仗,上面我講到服務(wù)端執(zhí)行session機制時候會生成session的id值吐咳,這個id值會發(fā)送給客戶端逻悠,客戶端每次請求都會把這個id值放到http請求的頭部發(fā)送給服務(wù)端,而這個id值在客戶端會保存下來韭脊,保存的容器就是cookie童谒,因此當(dāng)我們完全禁掉瀏覽器的cookie的時候,服務(wù)端的session也會不能正常使用沪羔。