一.什麼是cookies?
大家都知道,瀏覽器與WEB伺服器之間是使用HTTP協議進行通訊的,當某個使用者發出頁面請求時,WEB伺服器只是簡單的進行響應,然後就關閉與該使用者的串連。因此當一個請求發送到WEB伺服器時,無論其是否是第一次來訪,伺服器都會把它當作第一次來對待,這樣的不好之處可想而知。為了彌補這個缺陷,Netscape開發出了cookie這個有效工具來儲存某個使用者的識別資訊,因此人們暱稱為“小甜餅”。cookies是一種WEB伺服器通過瀏覽器在訪問者的硬碟上儲存資訊的手段:Netscape Navigator使用一個名為cookies.txt本地檔案儲存從所有網站接收的Cookie資訊;而IE瀏覽器把Cookie資訊儲存在類似於C:\windows\cookies的目錄下。當使用者再次訪問某個網站時,服務端將要求瀏覽器尋找並返回先前發送的Cookie資訊,來識別這個使用者。
cookies給網站和使用者帶來的好處非常多:
1、Cookie能使網站跟蹤特定訪問者的訪問次數、最後訪問時間和訪問者進入網站的路徑
2、Cookie能告訴線上廣告商廣告被點擊的次數 ,從而可以更精確的投放廣告
3、Cookie有效期間限未到時,Cookie能使使用者在不鍵入密碼和使用者名稱的情況下進入曾經瀏覽過的一些網站
4、Cookie能協助網站統計使用者設定檔以實現各種各樣的個人化服務
在JSP中,我們也可以使用Cookie,來編寫一些功能強大的應用程式。
下面,我想介紹一下如何用JSP建立和處理Cookie。
二.如何建立Cookie
說了這麼多,大家一定很想知道JSP是如何建立cookie了。JSP是使用如下的文法格式來建立cookie的:
Cookie cookie_name =new Cookie("Parameter","Value");
例如:Cookie newCookie =new Cookie("username","waynezheng"); response.addCookie(newCookie);
解釋:JSP是調用Cookie對象相應的建構函式Cookie(name,value)用合適的名字和值來建立Cookie,然後 Cookie可以通過HttpServletResponse的addCookie方法加入到Set-Cookie應答頭,本例中Cookie對象有兩個字串參數:username,waynezheng。注意,名字和值都不能包含空白字元以及下列字元: @ : ;? , " / [ ] ( ) =
處理Cookie的屬性
看到這裡,有的朋友又要問了:我光知道如何建立Cookie有什麼用呀?是呀,光知道如何建立Cookie而不知道怎麼使用是不夠的。在JSP中,程式是通過cookie.setXXX設定各種屬性,用cookie.getXXX讀出cookie的屬性,現把Cookie的主要屬性,及其方法列於下,供大家參考:
| 類型 |
方法名 |
方法解釋 |
| String |
getComment() |
返回cookie中注釋,如果沒有注釋的話將返回空值. |
| String |
getDomain() |
返回cookie中Cookie適用的網域名稱. 使用getDomain() 方法可以指示瀏覽器把Cookie返回給同 一域內的其他伺服器,而通常Cookie只返回給與發送它的伺服器名字完全相同的伺服器。注意網域名稱必須以點開始(例如.yesky.com) |
| int |
getMaxAge() |
返回Cookie到期之前的最大時間,以秒計算。 |
| String |
getName() |
返回Cookie的名字。名字和值是我們始終關心的兩個部分,筆者會在後面詳細介紹 getName/setName。 |
| String |
getPath() |
返回Cookie適用的路徑。如果不指定路徑,Cookie將返回給當前頁面所在目錄及其子目錄下 的所有頁面。 |
| boolean |
getSecure() |
如果瀏覽器通過安全性通訊協定發送cookies將返回true值,如果瀏覽器使用標準協議則返回false值。 |
| String |
getValue() |
返回Cookie的值。筆者也將在後面詳細介紹getValue/setValue。 |
| int |
getVersion() |
返回Cookie所遵從的協議版本。 |
| void |
setComment(String purpose) |
設定cookie中注釋。 |
| void |
setDomain(String pattern) |
設定cookie中Cookie適用的網域名稱 |
| void |
setMaxAge(int expiry) |
以秒計算,設定Cookie到期時間。 |
| void |
setPath(String uri) |
指定Cookie適用的路徑。 |
| void |
setSecure(boolean flag) |
指出瀏覽器使用的安全性通訊協定,例如HTTPS或SSL。 |
| void |
setValue(String newValue) |
cookie建立後設定一個新的值。 |
| void |
setVersion(int v) |
設定Cookie所遵從的協議版本。 |
讀取用戶端的Cookie
在Cookie發送到用戶端前,先要建立一個Cookie,然後用addCookie方法發送一個HTTP Header。 JSP將調用request.getCookies()從用戶端讀入Cookie,getCookies()方法返回一個HTTP要求標頭中的內容對應的Cookie對象數組。你只需要用逐一查看該數組的各個元素,調用getName方法檢查各個Cookie的名字,直至找到目標Cookie,然後對該Cookie調用getValue方法取得與指定名字關聯的值 。
例如
<% String userName=request.getParameter("username");//從提交的HTML表單中擷取,使用者名稱 Cookie theUsername=new Cookie("username",userName);//以"username",userName值/對建立一個Cookie response.addCookie(theUsername);%>..............<% Cookie myCookie[]=request.getCookies();//建立一個Cookie對象數組 for(int n=0;n=cookie.length-1;i++);//設立一個迴圈,來訪問Cookie對象數組的每一個元素 Cookie newCookie= myCookie[n]; if(newCookie.getName().equals("username")); //判斷元素的值是否為username中的值 {%> 你好,<%=newCookie.getValue()%>!//如果找到後,向他問好 <%}%>
設定Cookie的存在時間,及刪除Cookie 在JSP中,使用setMaxAge(int expiry)方法來設定Cookie的存在時間,參數expiry應是一個整數。正值表示cookie將在這麼多秒以後失效。 注意這個值是cookie將要存在的最大時間,而不是cookie現在的存在時間。 負值表示當瀏覽器關閉時,Cookie將會被刪除。零值則是要刪除該Cookie。 如:
<% Cookie deleteNewCookie=new Cookie("newcookie",null); deleteNewCookie.setMaxAge(0); deleteNewCookie.setPath("/"); response.addCookie(deleteNewCookie);%>
在firefox , ie , google chrome下測實驗證了下, 對於 逗號(,) , 空格, 分號(;) ,$打頭的字元 。cookie都無法正常寫入, 需要實現進行編碼encode處理
後記:本以為看懂上面噻,就可以做了,做完之後可以用,但是第二天當同事在別的頁面(不是產生cookie的頁面)調用我寫的cookie時,從debug上看老是沒有我加進去的cookie,後來從網上得知,我的cookie有兩點重要的沒有設定,一個是:setMaxage();另一個是setPath();當你的購物車需要修改數量或者往裡面添加數量的時候,你需要先去擷取cookie,但此時擷取的cookie,查看它們的maxAge以及path屬性你會發現都不是你所設定的,起初我也不是太明白,後來想通了,response.addCookie(cookie);是往你本地建立cookie檔案,擷取的時候當然不能還有maxAge和path了,因為擷取到maxAge,那說明它不會到期了,還有path有些地方說預設值就是setPath=“ /”,但是我在程式中沒寫這個其他的頁面無法擷取到這個cookie,因而我還是加上了。所以當你修改cookie時,記得將cookie.setMaxage();cookie.setPath("/');response.addCookie(cookie);再寫一遍