之前在項目中遇到這個問題,但不太會。最近各種筆試,這個問題出現的頻率太高了,幾乎每張試卷上都有,就花點時間總結了一下。采用老辦法,先在xmind上梳理,然后模仿寫了個小demo,現在大概知識點整理如下吧。
1.為什么使用cookies?
因為HTTP協議是無狀態的,對于一個瀏覽器發出的多次請求,WEB服務器無法區分 是不是來源于同一個瀏覽器。所以,需要額外的數據用于維護會話。 Cookie 正是這樣的一段隨HTTP請求一起被傳遞的額外數據。
2.cookies是什么?
cookie 就是瀏覽器儲存在用戶電腦上的一小段文本文件。cookie 是純文本格式,不包含任何可執行的代碼。
2.cookies的存儲大小是多少?
每個Cookie的大小一般不能超過4KB,超過這個長度的Cookie,將被忽略,不會被設置。
3.cookies保存哪些方面的信息?
Cookie的名字
Cookie的值
到期時間
所屬域名(默認是當前域名)
生效的路徑(默認是當前網址)
4.cookies的分類?
Cookies保存在客戶端中,按在客戶端中的存儲位置,可分為內存Cookie和硬盤Cookie。內存Cookie由瀏覽器維護,保存在內存中,瀏覽器關閉后就消失了,其存在時間是短暫的。硬盤Cookie保存在硬盤里,有一個過期時間,若要刪除cookies用戶手工清理的方式或到了過期時間,否則硬盤Cookie不會被刪除,其存在時間是長期的。所以,按存在時間,可分為非持久Cookie和持久Cookie。
5.cookies的數據如何移動?
(1)如果你在你的瀏覽器中輸入了web的URL,瀏覽器會象這個URL的web站點發送請求,比如,你在瀏覽器中輸入一下URL:http: //www.aaa.com,瀏覽器會將請求發送到aaa的web服務器,請求它的首頁。
(2)當瀏覽器發送請求時,它會查看你機器上跟域名www.aaa.com有關的Cookie文件,如果存在同www.aaa.com有關的 Cookie,瀏覽器就會把相關的Cookie“鍵-值”對數據跟請求一起發送到服務器,如果不存在同www.aaa.com有關的 Cookie,則瀏覽器不發送Cookie到服務器。
(3)aaa的web服務器收到Cookies數據和一個頁面的Http請求,如果收到了Cookie“鍵-值”對,aaa的web服務器將能夠使用它們。
(4)如果沒有收到Cookie“鍵-值”對,aaa的web服務器就能知道你以前沒有訪問過這個站點,服務器建立一個新的用戶ID,并在把你所請求的 頁面發回到你的瀏覽器時,把用戶ID“鍵-值”對發送到你的機器,你的硬盤就會駐留了對應這個站點的“鍵-值”對Cookie。
(5)web服務器可以在你訪問站點時,隨時的更改“鍵-值”對或者加入一個新的“鍵-值”對。
(6)同“鍵-值”對發送到客戶端的還有同這個“鍵-值”對相關的一些其它信息,其中之一就是Cookie有效期,另一個就是路徑(為了在同一個站點的不通部分關聯不同的Cookie)。
6.cookies的屬性?(參考阮一峰老師的說明)
(1)value屬性
value屬性是必需的,它是一個鍵值對,用于指定Cookie的值。
(2)expires屬性
expires屬性用于指定Cookie過期時間。它的格式采用Date.toUTCString()的格式。
如果不設置該屬性,或者設為null,Cookie只在當前會話(session)有效,瀏覽器窗口一旦關閉,當前Session結束,該Cookie就會被刪除。
瀏覽器根據本地時間,決定Cookie是否過期,由于本地時間是不精確的,所以沒有辦法保證Cookie一定會在服務器指定的時間過期。
(3)domain屬性
domain屬性指定Cookie所在的域名,比如example.com或.example.com(這種寫法將對所有子域名生效)、subdomain.example.com。
如果未指定,默認為設定該Cookie的域名。所指定的域名必須是當前發送Cookie的域名的一部分,比如當前訪問的域名是example.com,就不能將其設為google.com。只有訪問的域名匹配domain屬性,Cookie才會發送到服務器。
(4)path屬性
path屬性用來指定路徑,必須是絕對路徑(比如/、/mydir),如果未指定,默認為請求該Cookie的網頁路徑。
只有path屬性匹配向服務器發送的路徑,Cookie才會發送。這里的匹配不是絕對匹配,而是從根路徑開始,只要path屬性匹配發送路徑的一部分,就可以發送。比如,path屬性等于/blog,則發送路徑是/blog或者/blogroll,Cookie都會發送。path屬性生效的前提是domain屬性匹配。
(5)secure
secure屬性用來指定Cookie只能在加密協議HTTPS下發送到服務器。
該屬性只是一個開關,不需要指定值。如果通信是HTTPS協議,該開關自動打開。
(6)max-age
max-age屬性用來指定Cookie有效期,比如60 * 60 * 24 * 365
(即一年31536e3秒)
(7)HttpOnly
HttpOnly屬性用于設置該Cookie不能被JavaScript讀取.
(即document.cookie不會返回這個Cookie的值),只用于向服務器發送。
Set-Cookie: key=value; HttpOnly
上面的這個Cookie將無法用JavaScript獲取。進行AJAX操作時,XMLHttpRequest對象也無法包括這個Cookie。這主要是為了防止XSS攻擊盜取Cookie。
6.如何使用cookies?
(1)JavaScript 寫Cookie
用document.cookie設置Cookie,document.cookie屬性返回當前網頁的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 參數告訴瀏覽器 cookie 的路徑。默認情況下,cookie 屬于當前頁面。
document.cookie="username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 GMT; path=/";
注:
Cookie的值必須寫成key=value的形式,等號兩邊不能有空格。另外,寫入Cookie的時候,必須對分號、逗號和空格進行轉義(它們都不允許作為Cookie的值),這可以用encodeURIComponent方法達到。
但是,document.cookie一次只能寫入一個Cookie,而且寫入并不是覆蓋,而是添加
document.cookie = 'name1=aaa';
document.cookie = 'name2=bbb';
//相當于等于name1=aaa;name2=bbb
document.cookie屬性讀寫行為的差異(一次可以讀出全部Cookie,但是只能寫入一個Cookie),與服務器與瀏覽器之間的Cookie通信格式有關。瀏覽器向服務器發送Cookie的時候,是一行將所有Cookie全部發送。
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
關于以上存儲技術詳細的介紹及它們之間的區別,詳見后續文章吧(持續更新中...)
參考資料:
(1)http://javascript.ruanyifeng.com/bom/cookie.html
(2)http://www.lxweimin.com/p/8731e8d62b3d
(3)http://www.runoob.com/js/js-cookies.html