淺談cookies

之前在項目中遇到這個問題涨共,但不太會。最近各種筆試宠漩,這個問題出現(xiàn)的頻率太高了举反,幾乎每張試卷上都有,就花點時間總結(jié)了一下扒吁。采用老辦法火鼻,先在xmind上梳理,然后模仿寫了個小demo,現(xiàn)在大概知識點整理如下吧雕崩。

1.為什么使用cookies?

因為HTTP協(xié)議是無狀態(tài)的魁索,對于一個瀏覽器發(fā)出的多次請求,WEB服務器無法區(qū)分 是不是來源于同一個瀏覽器晨逝。所以蛾默,需要額外的數(shù)據(jù)用于維護會話。 Cookie 正是這樣的一段隨HTTP請求一起被傳遞的額外數(shù)據(jù)捉貌。

2.cookies是什么支鸡?

cookie 就是瀏覽器儲存在用戶電腦上的一小段文本文件。cookie 是純文本格式趁窃,不包含任何可執(zhí)行的代碼牧挣。

2.cookies的存儲大小是多少?

每個Cookie的大小一般不能超過4KB醒陆,超過這個長度的Cookie瀑构,將被忽略,不會被設置刨摩。

3.cookies保存哪些方面的信息寺晌?

Cookie的名字
Cookie的值
到期時間
所屬域名(默認是當前域名)
生效的路徑(默認是當前網(wǎng)址)

4.cookies的分類?

Cookies保存在客戶端中澡刹,按在客戶端中的存儲位置呻征,可分為內(nèi)存Cookie和硬盤Cookie。內(nèi)存Cookie由瀏覽器維護罢浇,保存在內(nèi)存中陆赋,瀏覽器關閉后就消失了,其存在時間是短暫的嚷闭。硬盤Cookie保存在硬盤里攒岛,有一個過期時間,若要刪除cookies用戶手工清理的方式或到了過期時間胞锰,否則硬盤Cookie不會被刪除灾锯,其存在時間是長期的。所以嗅榕,按存在時間顺饮,可分為非持久Cookie和持久Cookie色乾。

5.cookies的數(shù)據(jù)如何移動?

(1)如果你在你的瀏覽器中輸入了web的URL领突,瀏覽器會象這個URL的web站點發(fā)送請求,比如案怯,你在瀏覽器中輸入一下URL:http: //www.aaa.com君旦,瀏覽器會將請求發(fā)送到aaa的web服務器,請求它的首頁嘲碱。
(2)當瀏覽器發(fā)送請求時金砍,它會查看你機器上跟域名www.aaa.com有關的Cookie文件,如果存在同www.aaa.com有關的 Cookie麦锯,瀏覽器就會把相關的Cookie“鍵-值”對數(shù)據(jù)跟請求一起發(fā)送到服務器恕稠,如果不存在同www.aaa.com有關的 Cookie,則瀏覽器不發(fā)送Cookie到服務器扶欣。
(3)aaa的web服務器收到Cookies數(shù)據(jù)和一個頁面的Http請求鹅巍,如果收到了Cookie“鍵-值”對,aaa的web服務器將能夠使用它們料祠。
(4)如果沒有收到Cookie“鍵-值”對骆捧,aaa的web服務器就能知道你以前沒有訪問過這個站點,服務器建立一個新的用戶ID髓绽,并在把你所請求的 頁面發(fā)回到你的瀏覽器時敛苇,把用戶ID“鍵-值”對發(fā)送到你的機器,你的硬盤就會駐留了對應這個站點的“鍵-值”對Cookie顺呕。
(5)web服務器可以在你訪問站點時枫攀,隨時的更改“鍵-值”對或者加入一個新的“鍵-值”對。
(6)同“鍵-值”對發(fā)送到客戶端的還有同這個“鍵-值”對相關的一些其它信息株茶,其中之一就是Cookie有效期来涨,另一個就是路徑(為了在同一個站點的不通部分關聯(lián)不同的Cookie)。

6.cookies的屬性忌卤?(參考阮一峰老師的說明)

(1)value屬性

value屬性是必需的扫夜,它是一個鍵值對,用于指定Cookie的值驰徊。

(2)expires屬性

expires屬性用于指定Cookie過期時間笤闯。它的格式采用Date.toUTCString()的格式。
如果不設置該屬性棍厂,或者設為null颗味,Cookie只在當前會話(session)有效,瀏覽器窗口一旦關閉牺弹,當前Session結(jié)束浦马,該Cookie就會被刪除时呀。
瀏覽器根據(jù)本地時間,決定Cookie是否過期晶默,由于本地時間是不精確的谨娜,所以沒有辦法保證Cookie一定會在服務器指定的時間過期。

(3)domain屬性

domain屬性指定Cookie所在的域名磺陡,比如example.com或.example.com(這種寫法將對所有子域名生效)趴梢、subdomain.example.com。
如果未指定币他,默認為設定該Cookie的域名坞靶。所指定的域名必須是當前發(fā)送Cookie的域名的一部分,比如當前訪問的域名是example.com蝴悉,就不能將其設為google.com彰阴。只有訪問的域名匹配domain屬性,Cookie才會發(fā)送到服務器拍冠。

(4)path屬性

path屬性用來指定路徑尿这,必須是絕對路徑(比如/、/mydir)倦微,如果未指定妻味,默認為請求該Cookie的網(wǎng)頁路徑。
只有path屬性匹配向服務器發(fā)送的路徑欣福,Cookie才會發(fā)送责球。這里的匹配不是絕對匹配,而是從根路徑開始拓劝,只要path屬性匹配發(fā)送路徑的一部分雏逾,就可以發(fā)送。比如郑临,path屬性等于/blog栖博,則發(fā)送路徑是/blog或者/blogroll,Cookie都會發(fā)送厢洞。path屬性生效的前提是domain屬性匹配仇让。

(5)secure

secure屬性用來指定Cookie只能在加密協(xié)議HTTPS下發(fā)送到服務器。
該屬性只是一個開關躺翻,不需要指定值丧叽。如果通信是HTTPS協(xié)議,該開關自動打開公你。

(6)max-age

max-age屬性用來指定Cookie有效期踊淳,比如60 * 60 * 24 * 365
(即一年31536e3秒)

(7)HttpOnly

HttpOnly屬性用于設置該Cookie不能被JavaScript讀取.
(即document.cookie不會返回這個Cookie的值),只用于向服務器發(fā)送陕靠。

Set-Cookie: key=value; HttpOnly

上面的這個Cookie將無法用JavaScript獲取迂尝。進行AJAX操作時脱茉,XMLHttpRequest對象也無法包括這個Cookie。這主要是為了防止XSS攻擊盜取Cookie垄开。

6.如何使用cookies?

(1)JavaScript 寫Cookie
用document.cookie設置Cookie琴许,document.cookie屬性返回當前網(wǎng)頁的Cookie
document.cookie="username=John Doe";

您還可以為 cookie 添加一個過期時間(以 UTC 或 GMT 時間)。默認情況下溉躲,cookie 在瀏覽器關閉時刪除:

document.cookie="username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 GMT";

您可以使用 path 參數(shù)告訴瀏覽器 cookie 的路徑。默認情況下签财,cookie 屬于當前頁面偏塞。

document.cookie="username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 GMT; path=/";
注:

Cookie的值必須寫成key=value的形式,等號兩邊不能有空格灸叼。另外神汹,寫入Cookie的時候屁魏,必須對分號、逗號和空格進行轉(zhuǎn)義(它們都不允許作為Cookie的值)捉腥,這可以用encodeURIComponent方法達到。
但是抵碟,document.cookie一次只能寫入一個Cookie,而且寫入并不是覆蓋拟逮,而是添加

document.cookie = 'name1=aaa';
document.cookie = 'name2=bbb';
//相當于等于name1=aaa;name2=bbb

document.cookie屬性讀寫行為的差異(一次可以讀出全部Cookie撬统,但是只能寫入一個Cookie),與服務器與瀏覽器之間的Cookie通信格式有關敦迄。瀏覽器向服務器發(fā)送Cookie的時候恋追,是一行將所有Cookie全部發(fā)送。

GET /sample_page.html 
HTTP/1.1Host: www.example.org
Cookie:cookie_name1=cookie_value1;cookie_name2=cookie_value2
Accept: */*
Set-Cookie字段是服務器寫入瀏覽器的Cookie罚屋,一行一個
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: cookie_name1=cookie_value1 
Set-Cookie: cookie_name2=cookie_value2; expires=Sun, 16 Jul 3567 06:23:41 GMT
(2)讀cookies
var x = document.cookie;

document.cookie 將以字符串的方式返回所有的 cookies苦囱,類型格式: cookie1=value; cookie2=value; cookie3=value;

(3)修改cookies

如果原始的Cookie是用Set-Cookie設置的,改變上面這個cookie的值沿后,就必須使用同樣的Set-Cookie沿彭;
只要有一個屬性不同,就會生成一個全新的Cookie尖滚,而不是替換掉原來那個Cookie
如:

Set-Cookie: key1=aaa; domain=example.com; path=/blog

修改為:

Set-Cookie: key1=bbb; domain=example.com; path=/blog
(4)刪除cookies

刪除一個Cookie的簡便方法喉刘,就是設置expires屬性等于0瞧柔,或者等于一個過去的日期。

document.cookie = 'fontSize=;expires=Thu, 01-Jan-1970 00:00:01 GMT';
注:

上面代碼中睦裳,名為fontSize的Cookie的值為空造锅,過期時間設為1970年1月1月零點,就等同于刪除了這個Cookie廉邑。

7.Cookie的限制

(1)cookie會被附加在每個HTTP請求中哥蔚,所以無形中增加了流量。
(2)由于在HTTP請求中的cookie是明文傳遞的蛛蒙,所以安全性成問題糙箍。(除非用HTTPS)
(3)Cookie的大小限制在4KB左右。對于復雜的存儲需求來說是不夠用的牵祟。

8.和cookies類似的存儲技術深夯?

服務器端:
session
瀏覽器端:
WebStorage(localStorage、sessionStorage)
userData
indexedDB
關于以上存儲技術詳細的介紹及它們之間的區(qū)別诺苹,詳見后續(xù)文章吧(持續(xù)更新中...)
參考資料:
(1)http://javascript.ruanyifeng.com/bom/cookie.html
(2)http://www.reibang.com/p/8731e8d62b3d
(3)http://www.runoob.com/js/js-cookies.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咕晋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子收奔,更是在濱河造成了極大的恐慌掌呜,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坪哄,死亡現(xiàn)場離奇詭異质蕉,居然都是意外死亡,警方通過查閱死者的電腦和手機翩肌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門饰剥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摧阅,你說我怎么就攤上這事汰蓉。” “怎么了棒卷?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵顾孽,是天一觀的道長若厚。 經(jīng)常有香客問我,道長测秸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任铃拇,我火速辦了婚禮沈撞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘显晶。我一直安慰自己壹士,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布倦春。 她就那樣靜靜地躺著,像睡著了一般尿庐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凡泣,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天鞋拟,我揣著相機與錄音,去河邊找鬼贺纲。 笑死褪测,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的懈叹。 我是一名探鬼主播分扎,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卫漫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汛兜,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤粥谬,失蹤者是張志新(化名)和其女友劉穎辫塌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掺喻,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡储矩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年持隧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片只酥。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡裂允,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绝编,到底是詐尸還是另有隱情貌踏,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布绷跑,位于F島的核電站凡资,受9級特大地震影響谬运,放射性物質(zhì)發(fā)生泄漏梆暖。R本人自食惡果不足惜掂骏,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望级解。 院中可真熱鬧田绑,春花似錦、人聲如沸掩驱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拼苍。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苟鸯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工湾蔓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砌梆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓桃序,卻偏偏與公主長得像媒熊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芦鳍,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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