原文:http://www.169it.com/article/3217120921.html
Cookie總是保存在客戶端中,按在客戶端中的存儲位置,可分為內存Cookie和硬盤Cookie。內存Cookie由瀏覽器維護,保存在內存中,瀏覽器關閉后就消失了,其存在時間是短暫的。硬盤Cookie保存在硬盤里,有一個過期時間,除非用戶手工清理或到了過期時間,硬盤Cookie不會被刪除,其存在時間是長期的。所以,按存在時間,可分為非持久Cookie和持久Cookie。
1.cookie的屬性
一般cookie所具有的屬性,包括:
Domain:域,表示當前cookie所屬於哪個域或子域下面。
此處需要額外注意的是,在C#中,如果一個cookie不設置對應的Domain,那么在CookieContainer.Add(cookies)的時候,會死掉。對於服務器返回的Set-Cookie中,如果沒有指定Domain的值,那么其Domain的值是默認為當前所提交的http的請求所對應的主域名的。比如訪問 http://www.example.com,返回一個cookie,沒有指名domain值,那么其為值為默認的www.example.com。
Path:表示cookie的所屬路徑。
Expire time/Max-age:表示了cookie的有效期。expire的值,是一個時間,過了這個時間,該cookie就失效了。或者是用max-age指定當前cookie是在多長時間之后而失效。如果服務器返回的一個cookie,沒有指定其expire time,那么表明此cookie有效期只是當前的session,即是session cookie,當前session會話結束后,就過期了。對應的,當關閉(瀏覽器中)該頁面的時候,此cookie就應該被瀏覽器所刪除了。
secure:表示該cookie只能用https傳輸。一般用於包含認證信息的cookie,要求傳輸此cookie的時候,必須用https傳輸。
httponly:表示此cookie必須用於http或https傳輸。這意味着,瀏覽器腳本,比如javascript中,是不允許訪問操作此cookie的。
2.服務器發送cookie給客戶端
從服務器端,發送cookie給客戶端,是對應的Set-Cookie。包括了對應的cookie的名稱,值,以及各個屬性。
例如:
Set-Cookie: lu=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly
Set-Cookie: made_write_conn=1295214458; Path=/; Domain=.169it.com
Set-Cookie: reg_fb_gate=deleted; Expires=Thu, 01 Jan 1970 00:00:01 GMT; Path=/; Domain=.169it.com; HttpOnly
3.從客戶端把cookie發送到服務器
從客戶端發送cookie給服務器的時候,是不發送cookie的各個屬性的,而只是發送對應的名稱和值。
例如:
GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2
Accept: */*
4.關於修改,設置cookie
除了服務器發送給客戶端(瀏覽器)的時候,通過Set-Cookie,創建或更新對應的cookie之外,還可以通過瀏覽器內置的一些腳本,比如javascript,去設置對應的cookie,對應實現是操作js中的document.cookie。
5.Cookie的缺陷
(1)cookie會被附加在每個HTTP請求中,所以無形中增加了流量。
(2)由於在HTTP請求中的cookie是明文傳遞的,所以安全性成問題。(除非用HTTPS)
(3)Cookie的大小限制在4KB左右。對於復雜的存儲需求來說是不夠用的。