Cookie 的规范介绍
目前有以下幾種 Cookie 規(guī)范:
- Netscape cookie 草案:是最早的 cookie 規(guī)范,基于 rfc2109。盡管這個規(guī)范與 rc2109 有較大的差別,但是很多服務(wù)器都與之兼容。
- rfc2109, 是 w3c 發(fā)布的第一個官方 cookie 規(guī)范。理論上講,所有的服務(wù)器在處理 cookie( 版本 1) 時,都要遵循此規(guī)范。遺憾的是,這個規(guī)范太嚴(yán)格了,以致很多服務(wù)器不正確的實施了該規(guī)范或仍在使用 Netscape 規(guī)范。
- rfc2965 規(guī)范定義了 cookie 版本 2,并說明了 cookie 版本 1 的不足。
rfc2965 規(guī)范的使用,目前并不多。rfc2109 規(guī)范相應(yīng)要嚴(yán)格得多,在實際應(yīng)用上,并不是所有的瀏覽器和 Web 服務(wù)器都嚴(yán)格遵守。因此相比較而言,Netscape cookie 草案倒是一個比較簡潔和被廣泛支持的 Cookie 規(guī)范,因此我們在這里以 Netscape cookie 草案為基礎(chǔ)進(jìn)行討論,對于其他兩種規(guī)范,我們的討論和代碼具有相同的意義。關(guān)于 Netscape cookie 草案的細(xì)節(jié),大家可以參照 Netscape 官方站點,這里我們列舉一些和我們討論有關(guān)的內(nèi)容。
根據(jù) Netscape cookie 草案的描述,Cookie 是 Web 服務(wù)器向用戶的瀏覽器發(fā)送的一段 ASCII 碼文本。一旦收到 Cookie,瀏覽器會把 Cookie 的信息片斷以"名 / 值"對 (name-value pairs) 的形式儲存保存在本地。這以后,每當(dāng)向同一個 Web 服務(wù)器請求一個新的文檔時,Web 瀏覽器都會發(fā)送之站點以前存儲在本地的 Cookie。創(chuàng)建 Cookie 的最初目的是想讓 Web 服務(wù)器能夠通過多個 HTTP 請求追蹤客戶。有些復(fù)雜的網(wǎng)絡(luò)應(yīng)用需要在不同的網(wǎng)頁之間保持一致,它們需要這種會話狀態(tài)的保持能力。
瀏覽器與 Web 服務(wù)器通過 HTTP 協(xié)議進(jìn)行通訊,而 Cookie 就是保存在 HTTP 協(xié)議的請求或者應(yīng)答頭部(在 HTTP 協(xié)議中,數(shù)據(jù)包括兩部分,一部分是頭部,由一些名值對構(gòu)成,用來描述要被傳輸數(shù)據(jù)的一些信息。一部分是主體 (body),是真正的數(shù)據(jù)(如 HTML 頁面等))進(jìn)行傳送的。
在 HTML 文檔被發(fā)送之前,Web 服務(wù)器通過傳送 HTTP 包頭中的 Set-Cookie 消息把一個 cookie 發(fā)送到用戶的瀏覽器中。下面是一個遵循 Netscape cookie 草案的完整的 Set-Cookie 頭:
| Set-Cookie:customer=huangxp; path=/foo; domain=.ibm.com; expires= Wednesday, 19-OCT-05 23:12:40 GMT; [secure] |
Set-Cookie 的每個屬性解釋如下:
- Customer=huangxp 一個"名稱=值"對,把名稱 customer 設(shè)置為值"huangxp",這個屬性在 Cookie 中必須有。
- path=/foo 控制哪些訪問能夠觸發(fā) cookie 的發(fā)送。如果沒有指定 path,cookie 會在所有對此站點的 HTTP 傳送時發(fā)送。如果 path=/directory,只有訪問 /directory 下面的網(wǎng)頁時,cookie 才被發(fā)送。在這個例子中,用戶在訪問目錄 /foo 下的內(nèi)容時,瀏覽器將發(fā)送此 cookie。如果指定了 path,但是 path 與當(dāng)前訪問的 url 不符,則此 cookie 將被忽略。
- domain=.ibm.com 指定 cookie 被發(fā)送到哪臺計算機(jī)上。正常情況下,cookie 只被送回最初向用戶發(fā)送 cookie 的計算機(jī)。在這個例子中,cookie 會被發(fā)送到任何在 .ibm.com 域中的主機(jī)。如果 domain 被設(shè)為空,domain 就被設(shè)置為和提供 cookie 的 Web 服務(wù)器相同。如果 domain 不為空,并且它的值又和提供 cookie 的 Web 服務(wù)器域名不符,這個 Cookie 將被忽略。
- expires= Wednesday, 19-OCT-05 23:12:40 GMT 指定 cookie 失效的時間。如果沒有指定失效時間,這個 cookie 就不會被寫入計算機(jī)的硬盤上,并且只持續(xù)到這次會話結(jié)束。
- secure 如果 secure 這個詞被作為 Set-Cookie 頭的一部分,那么 cookie 只能通過安全通道傳輸(目前即 SSL 通道)。否則,瀏覽器將忽略此 Cookie。
一旦瀏覽器接收了 cookie,這個 cookie 和對遠(yuǎn)端 Web 服務(wù)器的連續(xù)請求將一起被瀏覽器發(fā)送。例如 前一個 cookie 被存入瀏覽器并且瀏覽器試圖請求 URL http://www.ibm.com/foo/index.html 時,下面的 HTTP 包頭就被發(fā)送到遠(yuǎn)端的 Web 服務(wù)器。
GET /foo/index.html HTTP/1.0
Cookie:customer=huangxp
一次典型的網(wǎng)絡(luò)瀏覽過程
在了解了 Cookie 協(xié)議的一些基本內(nèi)容之后,讓我們看看一次典型的網(wǎng)絡(luò)瀏覽過程中瀏覽器如何識別和處理 Cookie:
- 瀏覽器對于 Web 服務(wù)器應(yīng)答包頭中 Cookie 的操作步驟:
1. 從 Web 服務(wù)器的應(yīng)答包頭中提取所有的 cookie。
2. 解析這些 cookie 的組成部分(名稱,值,路徑等等)。
3. 判定主機(jī)是否允許設(shè)置這些 cookie。允許的話,則把這些 Cookie 存儲在本地。 - 瀏覽器對 Web 服務(wù)器請求包頭中所有的 Cookie 進(jìn)行篩選的步驟:
1. 根據(jù)請求的 URL 和本地存儲 cookie 的屬性,判斷那些 Cookie 能被發(fā)送給 Web 服務(wù)器。
2. 對于多個 cookie,判定發(fā)送的順序。
3. 把需要發(fā)送的 Cookie 加入到請求 HTTP 包頭中一起發(fā)送。
- 瀏覽器對于 Web 服務(wù)器應(yīng)答包頭中 Cookie 的操作步驟:
轉(zhuǎn)載于:https://www.cnblogs.com/zcy_soft/archive/2013/03/14/2958793.html
總結(jié)
以上是生活随笔為你收集整理的Cookie 的规范介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高速缓冲存储器的功能、结构与工作原理
- 下一篇: BZOJ 1601 [Usaco2008