新聞中心
用JSP創(chuàng)建cookie

創(chuàng)新互聯(lián)成立與2013年,先為建湖等服務(wù)建站,建湖等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為建湖企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
什么是cookies
大家都知道,瀏覽器與WEB服務(wù)器之間是使用HTTP協(xié)議進(jìn)行通信的,當(dāng)某個(gè)用戶發(fā)出頁(yè)面請(qǐng)求時(shí),WEB服務(wù)器只是簡(jiǎn)單的進(jìn)行響應(yīng),然后就關(guān)閉與該用戶的連接。因此當(dāng)一個(gè)請(qǐng)求發(fā)送到WEB服務(wù)器時(shí),無(wú)論其是否是第一次來(lái)訪,服務(wù)器都會(huì)把它當(dāng)作第一次來(lái)對(duì)待,這樣的不好之處可想而知。為了彌補(bǔ)這個(gè)缺陷,Netscape開發(fā)出了cookie這個(gè)有效的工具來(lái)保存某個(gè)用戶的識(shí)別信息,因此人們昵稱為“小甜餅”。cookies是一種WEB服務(wù)器通過(guò)瀏覽器在訪問(wèn)者的硬盤上存儲(chǔ)信息的手段:Netscape Navigator使用一個(gè)名為cookies.txt本地文件保存從所有站點(diǎn)接收的Cookie信息;而IE瀏覽器把Cookie信息保存在類似于C:\\windows\\cookies的目錄下。當(dāng)用戶再次訪問(wèn)某個(gè)站點(diǎn)時(shí),服務(wù)端將要求瀏覽器查找并返回先前發(fā)送的Cookie信息,來(lái)識(shí)別這個(gè)用戶。
cookies給網(wǎng)站和用戶帶來(lái)的好處非常多:
1. Cookie能使站點(diǎn)跟蹤特定訪問(wèn)者的訪問(wèn)次數(shù)、最后訪問(wèn)時(shí)間和訪問(wèn)者進(jìn)入站點(diǎn)的路徑
2. Cookie能告訴在線廣告商廣告被點(diǎn)擊的次數(shù),從而可以更精確的投放廣告
3. Cookie有效期限未到時(shí),Cookie能使用戶在不鍵入密碼和用戶名的情況下進(jìn)入曾經(jīng)瀏覽過(guò)的一些站點(diǎn)
4. Cookie能幫助站點(diǎn)統(tǒng)計(jì)用戶個(gè)人資料以實(shí)現(xiàn)各種各樣的個(gè)性化服務(wù)
在JSP中,我們也可以使用Cookie,來(lái)編寫一些功能強(qiáng)大的應(yīng)用程序。
創(chuàng)建Cookie
import="javax.servlet.http.Cookie" |
說(shuō)了這么多,大家一定很想知道JSP是如何創(chuàng)建cookie了。JSP是使用如下的語(yǔ)法格式來(lái)創(chuàng)建cookie的:
Cookie cookie_name =new Cookie("Parameter","Value");
|
例如:
Cookie username_Cookie =new Cookie("username","waynezheng"); |
解釋:JSP是調(diào)用Cookie對(duì)象相應(yīng)的構(gòu)造函數(shù)Cookie(name,value)用合適的名字和值來(lái)創(chuàng)建Cookie,然后Cookie可以通過(guò)HttpServletResponse的addCookie方法加入到Set-Cookie應(yīng)答頭,本例中Cookie對(duì)象有兩個(gè)字符串參數(shù):username,waynezheng。注意,名字和值都不能包含空白字符以及下列字符:
@ : ;? , " / [ ] ( ) = |
處理Cookie的屬性
看到這里,有的朋友又要問(wèn)了:我光知道如何創(chuàng)建Cookie有什么用呀?是呀,光知道如何創(chuàng)建Cookie而不知道怎么使用是不夠的。
在JSP中,程序是通過(guò)cookie.setXXX設(shè)置各種屬性,用cookie.getXXX讀出cookie的屬性,現(xiàn)在把Cookie的主要屬性,及其方法列于下,供大家參考:
|
類型 |
方法名 |
方法解釋 |
|
String |
getComment() |
返回cookie中注釋,如果沒(méi)有注釋的話將返回空值. |
|
String |
getDomain() |
返回cookie中Cookie適用的域名. 使用getDomain() 方法可以指示瀏覽器把Cookie返回給同 一域內(nèi)的其他服務(wù)器,而通常Cookie只返回給與發(fā)送它的服務(wù)器名字完全相同的服務(wù)器。注意域名必須以點(diǎn)開始(例如.yesky.com) |
|
int |
getMaxAge() |
返回Cookie過(guò)期之前的最大時(shí)間,以秒計(jì)算。 |
|
String |
getName() |
返回Cookie的名字。名字和值是我們始終關(guān)心的兩個(gè)部分,筆者會(huì)在后面詳細(xì)介紹 getName/setName。 |
|
String |
getPath() |
返回Cookie適用的路徑。如果不指定路徑,Cookie將返回給當(dāng)前頁(yè)面所在目錄及其子目錄下 的所有頁(yè)面。 |
|
boolean |
getSecure() |
如果瀏覽器通過(guò)安全協(xié)議發(fā)送cookies將返回true值,如果瀏覽器使用標(biāo)準(zhǔn)協(xié)議則返回false值。 |
|
String |
getValue() |
返回Cookie的值。筆者也將在后面詳細(xì)介紹getValue/setValue。 |
|
int |
getVersion() |
返回Cookie所遵從的協(xié)議版本。 |
|
void |
setComment(String purpose) |
設(shè)置cookie中注釋。 |
|
void |
setDomain(String pattern) |
設(shè)置cookie中Cookie適用的域名 |
|
void |
setMaxAge(int expiry) |
以秒計(jì)算,設(shè)置Cookie過(guò)期時(shí)間。 |
|
void |
setPath(String uri) |
指定Cookie適用的路徑。 |
|
void |
setSecure(boolean flag) |
指出瀏覽器使用的安全協(xié)議,例如HTTPS或SSL。 |
|
void |
setValue(String newValue) |
cookie創(chuàng)建后設(shè)置一個(gè)新的值。 |
|
void |
setVersion(int v) |
設(shè)置Cookie所遵從的協(xié)議版本。 |
讀取客戶端的Cookie
在Cookie發(fā)送到客戶端前,先要?jiǎng)?chuàng)建一個(gè)Cookie,然后用addCookie方法發(fā)送一個(gè)HTTP Header。JSP將調(diào)用request.getCookies()從客戶端讀入Cookie,getCookies()方法返回一個(gè)HTTP請(qǐng)求頭中的內(nèi)容對(duì)應(yīng)的Cookie對(duì)象數(shù)組。你只需要用循環(huán)訪問(wèn)該數(shù)組的各個(gè)元素,調(diào)用getName方法檢查各個(gè)Cookie的名字,直至找到目標(biāo)Cookie,然后對(duì)該Cookie調(diào)用getValue方法取得與指定名字關(guān)聯(lián)的值。
例如:
<% //以"username", userName 值/對(duì) 創(chuàng)建一個(gè)Cookie response.addCookie(theUsername); for(int n=0;n=cookie.length-1;i++);//設(shè)立一個(gè)循環(huán),來(lái)訪問(wèn)Cookie對(duì)象數(shù)組的每一個(gè)元素 Cookie newCookie= myCookie[n]; if(newCookie.getName().equals("username")); //判斷元素的值是否為username中的值 |
設(shè)置Cookie的存在時(shí)間,及刪除Cookie
在JSP中,使用setMaxAge(int expiry)方法來(lái)設(shè)置Cookie的存在時(shí)間,參數(shù)expiry應(yīng)是一個(gè)整數(shù)。正值表示cookie將在這么多秒以后失效。注意這個(gè)值是cookie將要存在的最大時(shí)間,而不是cookie現(xiàn)在的存在時(shí)間。負(fù)值表示當(dāng)瀏覽器關(guān)閉時(shí),Cookie將會(huì)被刪除。零值則是要?jiǎng)h除該Cookie。如:
<% |
#p#
用JSP操作Cookie
保存寫入Cookie
其實(shí)用JSP操作Cookie是非常簡(jiǎn)單的,我們來(lái)看下面一段JSP程序:
........(中間略) //保存寫入Cookie |
這樣我們就設(shè)置了一個(gè)Cookie,很簡(jiǎn)單吧?
我們來(lái)仔細(xì)研究一下這段代碼:
Cookie cookie=new Cookie(cookieName, "Test_Content"); |
這一行建立了一個(gè)Cookie對(duì)象,初始化有兩個(gè)參數(shù),第一個(gè)參數(shù)cookieName定義了Cookie的名字,后一個(gè)參數(shù),也是一個(gè)字符串,定義了Cookie的內(nèi)容。也就是我們希望網(wǎng)頁(yè)在用戶的機(jī)器上標(biāo)識(shí)的文件內(nèi)容。
接下來(lái)一行:cookie.setMaxAge(10),調(diào)用了Cookie中的setMaxAge方法,設(shè)定Cookie在用戶機(jī)器硬盤上的存活期為10秒。一個(gè)Cookie在用戶的硬盤里面存在的時(shí)間并不是無(wú)限期的,在建立Cookie對(duì)象的時(shí)候,我們必須制定Cookie的存活期,超過(guò)了這個(gè)存活期后,Cookie文件就不再起作用,會(huì)被用戶的瀏覽器自行刪除。如果我們希望用戶在下次訪問(wèn)這個(gè)頁(yè)面的時(shí)候,Cookie文件仍然有效而且可以被網(wǎng)頁(yè)讀出來(lái)的話,我們可以將Cookie的存活期設(shè)得稍微長(zhǎng)一些。比如cookie.setMaxAge(365*24*60*60)可以讓Cookie文件在一年內(nèi)有效。
讀取出Cookie
Cookie文件創(chuàng)建好后,自然還需要我們把它讀出來(lái),否則我們不是白費(fèi)力氣嗎?接下來(lái)我們看看如何讀出在用戶硬盤上的Cookie。
........(中間略) Name value <% for(int i=0;i<cookies.length-1;i++{ //用一個(gè)循環(huán)語(yǔ)句遍歷剛才建立的Cookie對(duì)象數(shù)組sname=sCookie.getName(); //取得這個(gè)Cookie的名字 <% |
這一小段JSP文件可以讀出用戶硬盤上的所有有效的Cookie,也就是仍然在存活期內(nèi)的Cookie文件。并用表格的形式列出每個(gè)Cookie的名字和內(nèi)容。
我們來(lái)逐行分析一下這段代碼:
Cookie cookies[]=request.getCookies() |
我們用request.getCookies()讀出用戶硬盤上的Cookie,并將所有的Cookie放到一個(gè)cookie對(duì)象數(shù)組里面。
接下來(lái)我們用一個(gè)循環(huán)語(yǔ)句遍歷剛才建立的Cookie對(duì)象數(shù)組,我們用sCookie=cookies[i]取出數(shù)組中的一個(gè)Cookie對(duì)象,然后我們用sCookie.getValue()和sCookie.getName()兩個(gè)方法來(lái)取得這個(gè)Cookie的名字和內(nèi)容。
通過(guò)將取出來(lái)的Cookie的名字和內(nèi)容放在字符串變量中,我們就能對(duì)其進(jìn)行各種操作了。在上面的例子里,可通過(guò)循環(huán)語(yǔ)句的遍歷,將所有Cookie放在一張表格中進(jìn)行顯示。
需要注意的一些問(wèn)題
通過(guò)上面兩個(gè)簡(jiǎn)單的例子,可以看到,用JSP進(jìn)行Cookie的操作,是非常簡(jiǎn)單的。不過(guò)我們?cè)趯?shí)際操作中還要注意一些問(wèn)題:
1. Cookie的兼容性問(wèn)題
Cookie的格式有2個(gè)不同的版本,第一個(gè)版本,我們稱為Cookie Version 0,是最初由Netscape公司制定的,也被幾乎所有的瀏覽器支持。而較新的版本,Cookie Version 1,則是根據(jù)RFC 2109文檔制定的。為了確保兼容性,JAVA規(guī)定,前面所提到的涉及Cookie的操作都是針對(duì)舊版本的Cookie進(jìn)行的。而新版本的Cookie目前還不被Javax.servlet.http.Cookie包所支持。
2. Cookie的內(nèi)容
同樣的Cookie的內(nèi)容的字符限制針對(duì)不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格、方括號(hào)、圓括號(hào)、等于號(hào)(=)、逗號(hào)、雙引號(hào)、斜杠、問(wèn)號(hào)、@符號(hào)、冒號(hào)、分號(hào)都不能作為Cookie的內(nèi)容。這也就是為什么我們?cè)诶又性O(shè)定Cookie的內(nèi)容為"Test_Content"的原因。
雖然在Cookie Version 1規(guī)定中放寬了限制,可以使用這些字符,但是考慮到新版本的Cookie規(guī)范目前仍然沒(méi)有為所有的瀏覽器所支持,因而為保險(xiǎn)起見,我們應(yīng)該在Cookie的內(nèi)容中盡量避免使用這些字符。
名稱欄目:JSP開發(fā)中Cookie使用完全詳解
標(biāo)題路徑:http://fisionsoft.com.cn/article/dhejpgj.html


咨詢
建站咨詢
