cookies的详细使用说明
一.什么是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開(kāi)發(fā)出了cookie這個(gè)有效的工具來(lái)保存某個(gè)用戶的識(shí)別信息,因此人們昵稱為“小甜餅”。cookies是一種WEB服務(wù)器通過(guò)?瀏覽器在訪問(wèn)者的硬盤(pá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)編寫(xiě)一些功能強(qiáng)大的應(yīng)用程序。
下面,我想介紹一下如何用JSP創(chuàng)建和處理Cookie。
二.如何創(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");?
response.addCookie(username_Cookie);
解釋: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)開(kāi)始(例如.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)的值。
例如
<%
//從提交的HTML表單中獲取,用戶名
String?userName=request.getParameter("username");
//以"username", userName 值/對(duì) 創(chuàng)建一個(gè)Cookie
Cookie?theUsername=new?Cookie("username",userName);
response.addCookie(theUsername);
%>
..............
<%
Cookie?myCookie[]=request.getCookies();//創(chuàng)建一個(gè)Cookie對(duì)象數(shù)組
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中的值
{%>
你好,<%=newCookie.getValue()%>!//如果找到后,向他問(wèn)好
<%}
%>
設(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。如:
<%
Cookie?deleteNewCookie=new?Cookie("newcookie",null);
deleteNewCookie.setMaxAge(0); //刪除該Cookie
deleteNewCookie.setPath("/");?
response.addCookie(deleteNewCookie);
%>??
一、?前言?
說(shuō)起來(lái),Cookie應(yīng)該是一種應(yīng)用較久的技術(shù)了。早在HTML剛剛出現(xiàn)的時(shí)候,在每個(gè)獨(dú)立的頁(yè)面之間沒(méi)有辦法記錄和標(biāo)識(shí)不同的用戶。后來(lái)人們就發(fā)明了?Cookie技術(shù),當(dāng)用戶訪問(wèn)網(wǎng)頁(yè)時(shí),它能夠在訪問(wèn)者的機(jī)器上創(chuàng)立一個(gè)文件,我們把它叫作Cookie,寫(xiě)一段內(nèi)容進(jìn)去,來(lái)標(biāo)識(shí)不同的用戶。如果下次用戶?再訪問(wèn)這個(gè)網(wǎng)頁(yè)的時(shí)候,它又能夠讀出這個(gè)文件里面的內(nèi)容,這樣網(wǎng)頁(yè)就知道上次這個(gè)用戶已經(jīng)訪問(wèn)過(guò)該網(wǎng)頁(yè)了。
雖然現(xiàn)在網(wǎng)頁(yè)的制作技術(shù)比起幾年以前已經(jīng)發(fā)展了許多。不過(guò)有些時(shí)候,Cookie還是能夠幫我們很多忙的。接下來(lái),我們就來(lái)看看,如何在寫(xiě)JSP文件的時(shí)候,用JSP操作Cookie。
=======================================
二、?保存寫(xiě)入Cookie
其實(shí)用JSP操作Cookie是非常簡(jiǎn)單的,我們來(lái)看下面一段JSP程序:
........(中間略)
//保存寫(xiě)入Cookie?
<%?
String?cookieName="Sender";?
Cookie?cookie=new?Cookie(cookieName,?"Test_Content");?
cookie.setMaxAge(10);???//存活期為10秒
response.addCookie(cookie);?
%>?
........(其他內(nèi)容)
這樣我們就設(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ī)器硬盤(pán)上的存活?期為10秒。一個(gè)Cookie在用戶的硬盤(pán)里面存在的時(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)我們看看如何讀出在用戶硬盤(pán)上的Cookie。
........(中間略)
Name?value
<%?
Cookie?cookies[]=request.getCookies();?//讀出用戶硬盤(pán)上的Cookie,并將所有的Cookie放到一個(gè)cookie對(duì)象數(shù)組里面
Cookie?sCookie=null;?
String?svalue=null;?
String?sname=null;?
for(int?i=0;i<cookies.length-1;i++{????//用一個(gè)循環(huán)語(yǔ)句遍歷剛才建立的Cookie對(duì)象數(shù)組
sCookie=cookies[i];???//取出數(shù)組中的一個(gè)Cookie對(duì)象
sname=sCookie.getName();?//取得這個(gè)Cookie的名字
svalue=sCookie.getValue();?//取得這個(gè)Cookie的內(nèi)容
%>
<%?
}?
%>
name? value
<%=name%>?<%=svalue%>
........(其他內(nèi)容)
這一小段JSP文件可以讀出用戶硬盤(pán)上的所有有效的Cookie,也就是仍然在存活期內(nèi)的Cookie文件。并用表格的形式列出每個(gè)Cookie的名字和內(nèi)容。
我們來(lái)逐行分析一下這段代碼:?
Cookie?cookies[]=request.getCookies()?我們用request.getCookies()讀出用戶硬盤(pán)上的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)起見(jiàn),我們應(yīng)該在Cookie的內(nèi)容中盡量避免使用這些字符。(
?
?3.cookie的刪除
?
cookie為什么刪除不了,所以寫(xiě)了給小總結(jié),希望對(duì)用cookie的各位兄弟有幫助?
對(duì)于cookie,最主要的當(dāng)然是讀取和設(shè)置了,下面分兩方面說(shuō)明.?
一、設(shè)置?
Cookie是通過(guò)HttpServletResponse的addCookie方法加入到Set-Cookie應(yīng)答頭中的?
例如:?
Cookie?userCookie?=?new?Cookie("user",?"admin");?
response.addCookie(userCookie);?
和設(shè)置有關(guān)系的還有以下兩個(gè)重要方法?
1.setMaxAge?
設(shè)置Cookie過(guò)期之前的時(shí)間,以秒計(jì)。如果不設(shè)置該值,則Cookie只在當(dāng)前會(huì)話內(nèi)有效,而且這些Cookie不會(huì)保存到磁盤(pán)上。?
注意:刪除cookie就是通過(guò)該方法實(shí)現(xiàn)的。將要?jiǎng)h除的cookie的過(guò)期之前的時(shí)間指定為0就可以達(dá)到刪除該cookie的目的。?
2.setPath?
設(shè)置Cookie適用的路徑。如果不指定路徑,Cookie將返回給當(dāng)前頁(yè)面(JSP頁(yè)面或者Servlet的映射)所在目錄及其子目錄下的所有頁(yè)面。?
注意:?
A:所有的cookie都是有路徑的?
B:該方法設(shè)置的路徑為客戶端路徑,即“/”代表服務(wù)器根目錄,而不是WEB應(yīng)用根目錄?
C:該方法設(shè)置路徑時(shí),“/myWeb/”與“/myWeb”是不同的,要特別注意;前者可以關(guān)聯(lián)到服務(wù)器的myWeb目錄下,而或者則不可以。?
D:?該方法設(shè)置路徑時(shí),沒(méi)有相對(duì)目錄可言,即不論在哪個(gè)目錄下設(shè)置setPath(“/myWeb/”),該cookie都將關(guān)聯(lián)到服務(wù)器的myWeb目錄下?(setPath(“/myWeb”)則不可以),而不是當(dāng)前目錄的myWeb的子目錄下;同樣,設(shè)置setPath(“myWeb/”)和?setPath(“myWeb”)也不能關(guān)聯(lián)到當(dāng)前目錄的myWeb的子目錄下?
這里有個(gè)奇怪的例子,就是在一個(gè)web應(yīng)用下設(shè)置的cookie可以在另一個(gè)web應(yīng)用下獲得(兩個(gè)web應(yīng)用在同一個(gè)服務(wù)器下)?
目錄結(jié)構(gòu):在服務(wù)器根目錄上有web1和web2兩個(gè)目錄,在web1下有setcookie.jsp和getcookie.jsp、在web2下有getcookie.jsp?
web1下的setcookie.jsp?
web1下的getcookie.jsp?
web2下的getcookie.jsp?
先?訪問(wèn)web1下的setcookie.jsp,然后分別訪問(wèn)web1和web2下面的getcookie.jsp文件,你會(huì)發(fā)現(xiàn)奇怪的現(xiàn)象,web1下的?getcookie.jsp中user為空而web2下的getcookie.jsp中user卻有值,這就實(shí)現(xiàn)了從一個(gè)web應(yīng)用下設(shè)置的cookie?在另一個(gè)web應(yīng)用下獲得。?
大多數(shù)人刪除cookie不成功都是因?yàn)槟夸浽?。一個(gè)典型的原因是在某一個(gè)目錄中設(shè)置了cookie(沒(méi)有調(diào)用setPath方法)卻在另一個(gè)目錄中刪除該cookie(其實(shí)是調(diào)用setMaxAge方法)?
二、讀取?
從?客戶端讀取Cookie時(shí)調(diào)用的是HttpServletRequest的getCookies方法。該方法返回一個(gè)與HTTP請(qǐng)求頭中的內(nèi)容對(duì)應(yīng)的?Cookie對(duì)象數(shù)組。得到這個(gè)數(shù)組之后,一般是用循環(huán)訪問(wèn)其中的各個(gè)元素,調(diào)用getName檢查各個(gè)Cookie的名字,直至找到目標(biāo)Cookie。?然后對(duì)這個(gè)目標(biāo)Cookie調(diào)用getValue,根據(jù)獲得的結(jié)果進(jìn)行其他處理。?
注意:若JSP和Servlet所在目錄(Servlet為其映射目錄)的父目錄中有同名cookie,則request.getCookie()方法得到的Cookie數(shù)組中保存的是其父目錄中的cookie的信息;
轉(zhuǎn)載于:https://www.cnblogs.com/sallon/archive/2012/07/20/2600671.html
總結(jié)
以上是生活随笔為你收集整理的cookies的详细使用说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CSS Overflow属性详解(转)
- 下一篇: RichTextBox粘贴两次以及去掉粘