天天看點

cookie相關生命周期使用

Cookie在生成時就會被指定一個Expire值,這就是Cookie的生存周期,在這個周期内Cookie有效,超出周期Cookie就會被清除。有些頁面将Cookie的生存周期設定為“0”或負值,這樣在關閉浏覽器時,就馬上清除Cookie,不會記錄使用者資訊,更加安全。

Java中把Cookie封裝成了javax.servlet.http.Cookie類。每個Cookie都是該Cookie類的對象。伺服器通過操作Cookie類對象對用戶端Cookie進行操作。通過request.getCookie()擷取用戶端送出的所有Cookie(以Cookie[]數組形式傳回),通過response.addCookie(Cookiecookie)向用戶端設定Cookie。

Cookie對象使用key-value屬性對的形式儲存使用者狀态,一個Cookie對象儲存一個屬性對,一個request或者response同時使用多個Cookie。因為Cookie類位于包javax.servlet.http.*下面,是以JSP中不需要import該類。

1.1.8  Cookie的修改、删除

Cookie并不提供修改、删除操作。如果要修改某個Cookie,隻需要建立一個同名的Cookie,添加到response中覆寫原來的Cookie。

如果要删除某個Cookie,隻需要建立一個同名的Cookie,并将maxAge設定為0,并添加到response中覆寫原來的Cookie。注意是0而不是負數。負數代表其他的意義。讀者可以通過上例的程式進行驗證,設定不同的屬性。

注意:修改、删除Cookie時,建立的Cookie除value、maxAge之外的所有屬性,例如name、path、domain等,都要與原Cookie完全一樣。否則,浏覽器将視為兩個不同的Cookie不予覆寫,導緻修改、删除失敗。

1.1.9  Cookie的域名

Cookie是不可跨域名的。域名www.google.com頒發的Cookie不會被送出到域名www.baidu.com去。這是由Cookie的隐私安全機制決定的。隐私安全機制能夠禁止網站非法擷取其他網站的Cookie。

正常情況下,同一個一級域名下的兩個二級域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能互動使用Cookie,因為二者的域名并不嚴格相同。如果想所有helloweenvsfei.com名下的二級域名都可以使用該Cookie,需要設定Cookie的domain參數,例如:

讀者可以修改本機C:\WINDOWS\system32\drivers\etc下的hosts檔案來配置多個臨時域名,然後使用setCookie.jsp程式來設定跨域名Cookie驗證domain屬性。

注意:domain參數必須以點(".")開始。另外,name相同但domain不同的兩個Cookie是兩個不同的Cookie。如果想要兩個域名完全不同的網站共有Cookie,可以生成兩個Cookie,domain屬性分别為兩個域名,輸出到用戶端。

1.1.10  Cookie的路徑

domain屬性決定運作通路Cookie的域名,而path屬性決定允許通路Cookie的路徑(ContextPath)。例如,如果隻允許/sessionWeb/下的程式使用Cookie,可以這麼寫:

設定為“/”時允許所有路徑使用Cookie。path屬性需要使用符号“/”結尾。name相同但domain相同的兩個Cookie也是兩個不同的Cookie。

注意:頁面隻能擷取它屬于的Path的Cookie。例如/session/test/a.jsp不能擷取到路徑為/session/abc/的Cookie。使用時一定要注意。

1.1.11  Cookie的安全屬性

HTTP協定不僅是無狀态的,而且是不安全的。使用HTTP協定的資料不經過任何加密就直接在網絡上傳播,有被截獲的可能。使用HTTP協定傳輸很機密的内容是一種隐患。如果不希望Cookie在HTTP等非安全協定中傳輸,可以設定Cookie的secure屬性為true。浏覽器隻會在HTTPS和SSL等安全協定中傳輸此類Cookie。下面的代碼設定secure屬性為true:

Cookie cookie = new Cookie("time", "20080808"); // 建立Cookie

cookie.setSecure(true);                           // 設定安全屬性

response.addCookie(cookie);                        // 輸出到用戶端

提示:secure屬性并不能對Cookie内容加密,因而不能保證絕對的安全性。如果需要高安全性,需要在程式中對Cookie内容加密、解密,以防洩密。

1.1.12  JavaScript操作Cookie

Cookie是儲存在浏覽器端的,是以浏覽器具有操作Cookie的先決條件。浏覽器可以使用腳本程式如JavaScript或者VBScript等操作Cookie。這裡以JavaScript為例介紹常用的Cookie操作。例如下面的代碼會輸出本頁面所有的Cookie。

<script>document.write(document.cookie);</script>

由于JavaScript能夠任意地讀寫Cookie,有些好事者便想使用JavaScript程式去窺探使用者在其他網站的Cookie。不過這是徒勞的,W3C組織早就意識到JavaScript對Cookie的讀寫所帶來的安全隐患并加以防備了,W3C标準的浏覽器會阻止JavaScript讀寫任何不屬于自己網站的Cookie。換句話說,A網站的JavaScript程式讀寫B網站的Cookie不會有任何結果。

1.2 Cookie基本工作原理

Cookie使用HTTPHeader傳遞資料。Cookie機制定義了兩種報頭:Set-Cookie報頭和Cookie報頭。Set-Cookie報頭包含于Web伺服器的響應頭(ResponseHeader)中,Cookie報頭包含在浏覽器用戶端請求頭(ReguestHeader)中。

Cookie的運作過程如圖所示,具體分析如下

cookie相關生命周期使用

Cookie的運作過程圖

(1)用戶端在浏覽器的位址欄中鍵入Web伺服器的URL,浏覽器發送讀取網頁的請求。

(2)伺服器接收到請求後,産生一個Set-Cookie報頭,放在HTTP封包中一起回傳用戶端,發起一次會話。

(3)用戶端收到應答後,若要繼續該次會話,則将Set-Cook-ie中的内容取出,形成一個Cookie.txt檔案儲存在用戶端計算機裡。

(4)當用戶端再次向伺服器送出請求時,浏覽器先在電腦裡尋找對應該網站的Cookie.txt檔案。如果找到,則根據此Cookie.txt産生Cookie報頭,放在HTTP請求封包中發給伺服器。

(5)伺服器接收到包含Cookie報頭的請求,檢索其Cookie中與使用者有關的資訊,生成一個用戶端所請示的頁面應答傳遞給用戶端。 浏覽器的每一次網頁請求,都可以傳遞已存在的Cookie檔案,例如,浏覽器的打開或重新整理網頁操作。

唯有不斷學習方能改變!

-- <b>Ryan Miao</b>

繼續閱讀