cookie的用法

什麼是Cookie

Cookie是一種在客戶端保持HTTP狀態信息的技術,它好比商場發放的優惠卡。

Cookie是在瀏覽器訪問WEB服務器的某個資源時,由WEB服務器在HTTP響應消息頭中附帶傳送給瀏覽器的一片數據,WEB服務器傳送給各個客戶端瀏覽器的數據是可以各不相同的。

一旦WEB瀏覽器保存了某個Cookie,那麼它在以後每次訪問該WEB服務器時,都應在HTTP請求頭中將這個Cookie回傳給WEB服務器。

WEB服務器通過在HTTP響應消息中增加Set-Cookie響應頭字段將Cookie信息發送給瀏覽器,瀏覽器則通過在HTTP請求消息中增加Cookie請求頭字段將Cookie回傳給WEB服務器。

一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。

一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。

瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制爲4KB。  

Set-Cookie2響應頭字段

Set-Cookie2頭字段用於指定WEB服務器向客戶端傳送的Cookie內容,但是按照Netscape規範實現Cookie功能的WEB服務器,使用的是Set-Cookie頭字段,兩者的語法和作用類似。

Set-Cookie2頭字段中設置的cookie內容是具有一定格式的字符串,它必須以Cookie的名稱和設置值開頭,格式爲“名稱=值”,後面可以加上0個或多個以分號(;)和空格分隔的其它可選屬性,屬性格式一般爲“屬性名=值”。舉例:Set-Cookie2:user=it315; Version=1; Path=/

除了“名稱=值”對必須位於最前面外,其它的可選屬性的先後順序可以任意。

Cookie的名稱只能由普通的英文ASCII字符組成,瀏覽器不用關心和理解Cookie的值部分的意義和格式,只要WEB服務器能理解值部分的意義就行。

大多數現有的WEB服務器都是採用某種編碼方式將值部分的內容編碼成可打印的ASCII字符,RFC 2965規範中沒有明確限定編碼方式。

Cookie請求頭字段

瀏覽器使用Cookie請求頭字段將Cookie信息回送給WEB服務器。

多個Cookie信息通過一個Cookie請求頭字段回送給WEB服務器。 

瀏覽器根據下面的幾個規則決定是否發送某個Cookie信息:

請求的主機名是否與某個存儲的Cookie的Domain屬性匹配;

請求的端口號是否在該Cookie的Port屬性列表中;

請求的資源路徑是否在該Cookie的Path屬性指定的目錄及子目錄中;

該Cookie的有效期是否已過。

Cookie請求頭字段中的每個Cookie之間用逗號(,)或分號(;)分隔。

在Cookie請求頭字段中除了必須有“名稱=值”的設置外,還可以有Version、Path、Domain、Port等幾個屬性。

在Version、Path、Domain、Port等屬性名之前,都要增加一個“$”字符作爲前綴。

Version屬性只能出現一次,且要位於Cookie請求頭字段設置值的最前面,如果需要設置某個Cookie信息的 Path、Domain、Port等屬性,它們必須位於該Cookie信息的“名稱=值”設置之後。

Path屬性指向子目錄的Cookie排在Path屬性指向父目錄的Cookie之前。   

在Servlet程序中使用Cookie

ServletAPI中提供了一個javax.servlet.http.Cookie類來封裝Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各個屬性的方法。

Cookie類的方法:

構造方法: public Cookie(java.lang.String name,java.lang.String value)

getName方法

setValue與getValue方法

setMaxAge與getMaxAge方法

setPath與getPath方法

setDomain與getDomain方法

setVersion與getVersion方法

setComment與getComment方法

setSecure與getSecure方法

HttpServletResponse接口中定義了一個addCookie方法,它用於在發送給瀏覽器的HTTP響應消息中增加一個Set-Cookie響應頭字段。

HttpServletRequest接口中定義了一個getCookies方法,它用於從HTTP請求消息的Cookie請求頭字段中讀取所有的Cookie項。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章