一.什麼是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
import="javax.servlet.http.Cookie"
說了這麼多,大家一定很想知道JSP是如何建立cookie了。JSP是使用如下的文法格式來建立cookie的:
Cookie cookie_name =new Cookie("Parameter","Value");
例如:
Cookie username_Cookie =new Cookie("username","waynezheng");
response.addCookie(username_Cookie);
解釋: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方法取得與指定名字關聯的值。
例如
<%
//從提交的HTML表單中擷取,使用者名稱
String userName=request.getParameter("username");
//以"username", userName 值/對 建立一個Cookie
Cookie theUsername=new Cookie("username",userName);
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); //刪除該Cookie
deleteNewCookie.setPath("/");
response.addCookie(deleteNewCookie);
%>
一、 前言
說起來,Cookie應該是一種應用較久的技術了。早在HTML剛剛出現的時候,在每個獨立的頁面之間沒有辦法記錄和標識不同的使用者。後來人們就發明了
Cookie技術,當使用者訪問網頁時,它能夠在訪問者的機器上創立一個檔案,我們把它叫作Cookie,寫一段內容進去,來標識不同的使用者。如果下次使用者
再訪問這個網頁的時候,它又能夠讀出這個檔案裡面的內容,這樣網頁就知道上次這個使用者已經訪問過該網頁了。
雖然現在網頁的製作技術比起幾年以前已經發展了許多。不過有些時候,Cookie還是能夠幫我們很多忙的。接下來,我們就來看看,如何在寫JSP檔案的時候,用JSP操作Cookie。
=======================================
二、 儲存寫入Cookie
其實用JSP操作Cookie是非常簡單的,我們來看下面一段JSP程式:
........(中間略)
//儲存寫入Cookie
<%
String cookieName="Sender";
Cookie cookie=new Cookie(cookieName, "Test_Content");
cookie.setMaxAge(10); //存活期為10秒
response.addCookie(cookie);
%>
........(其他內容)
這樣我們就設定了一個Cookie,很簡單吧?
我們來仔細研究一下這段代碼:
Cookie cookie=new Cookie(cookieName, "Test_Content");
這一行建立了一個Cookie對象,初始化有兩個參數,第一個參數cookieName定義了Cookie的名字,後一個參數,也是一個字串,定義了Cookie的內容。也就是我們希望網頁在使用者的機器上標識的檔案內容。
接下來一行:cookie.setMaxAge(10),調用了Cookie中的setMaxAge方法,設定Cookie在使用者機器硬碟上的存活
期為10秒。一個Cookie在使用者的硬碟裡面存在的時間並不是無限期的,在建立Cookie對象的時候,我們必須制定Cookie的存活期,超過了這個
存活期後,Cookie檔案就不再起作用,會被使用者的瀏覽器自行刪除。如果我們希望使用者在下次訪問這個頁面的時候,Cookie檔案仍然有效而且可以被網
頁讀出來的話,我們可以將Cookie的存活期設得稍微長一些。比如cookie.setMaxAge(365*24*60*60)可以讓Cookie檔案在一年內有效。
三、 讀取出Cookie
Cookie檔案建立好後,自然還需要我們把它讀出來,否則我們不是白費力氣嗎?接下來我們看看如何讀出在使用者硬碟上的Cookie。
........(中間略)
Name value
<%
Cookie cookies[]=request.getCookies(); //讀出使用者硬碟上的Cookie,並將所有的Cookie放到一個cookie對象數組裡面
Cookie sCookie=null;
String svalue=null;
String sname=null;
for(int i=0;i<cookies.length-1;i++{ //用一個迴圈語句遍曆剛才建立的Cookie對象數組
sCookie=cookies[i]; //取出數組中的一個Cookie對象
sname=sCookie.getName(); //取得這個Cookie的名字
svalue=sCookie.getValue(); //取得這個Cookie的內容
%>
<%
}
%>
name value
<%=name%> <%=svalue%>
........(其他內容)
這一小段JSP檔案可以讀出使用者硬碟上的所有有效Cookie,也就是仍然在存活期內的Cookie檔案。並用表格的形式列出每個Cookie的名字和內容。
我們來逐行分析一下這段代碼:
Cookie cookies[]=request.getCookies() 我們用request.getCookies()讀出使用者硬碟上的Cookie,並將所有的Cookie放到一個cookie對象數組裡面。
接下來我們用一個迴圈語句遍曆剛才建立的Cookie對象數組,我們用sCookie=cookies[i]取出數組中的一個Cookie對象,然後我們
用sCookie.getValue()和sCookie.getName()兩個方法來取得這個Cookie的名字和內容。
通過將取出來的Cookie的名字和內容放在字串變數中,我們就能對其進行各種操作了。在上面的例子裡,可通過迴圈語句的遍曆,將所有Cookie放在一張表格中進行顯示。
=======================================
四、 需要注意的一些問題
通過上面兩個簡單的例子,可以看到,用JSP進行Cookie的操作,是非常簡單的。不過我們在實際操作中還要注意一些問題:
1. Cookie的相容性問題
Cookie的格式有2個不同的版本,第一個版本,我們稱為Cookie Version
0,是最初由Netscape公司制定的,也被幾乎所有的瀏覽器支援。而較新的版本,Cookie Version 1,則是根據RFC
2109文檔制定的。為了確保相容性,JAVA規定,前面所提到的涉及Cookie的操作都是針對舊版本的Cookie進行的。而新版本的Cookie目
前還不被Javax.servlet.http.Cookie包所支援。
2. Cookie的內容
同樣的Cookie的內容的字元限制針對不同的Cookie版本也有不同。在Cookie Version
0中,某些特殊的字元,例如:空格,方括弧,圓括弧,等號(=),逗號,雙引號,斜杠,問號,@符號,冒號,分號都不能作為Cookie的內容。這也就
是為什麼我們在例子中設定Cookie的內容為"Test_Content"的原因。
雖然在Cookie Version 1規定中放寬了限制,可以使用這些字元,但是考慮到新版本的Cookie規範目前仍然沒有為所有的瀏覽器所支援,因而為保險起見,我們應該在Cookie的內容中盡量避免使用這些字元。(