什麼是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項。