cookies的详细使用说明
一.什么是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的內容中盡量避免使用這些字符。(
?
?3.cookie的刪除
?
cookie為什么刪除不了,所以寫了給小總結,希望對用cookie的各位兄弟有幫助?
對于cookie,最主要的當然是讀取和設置了,下面分兩方面說明.?
一、設置?
Cookie是通過HttpServletResponse的addCookie方法加入到Set-Cookie應答頭中的?
例如:?
Cookie?userCookie?=?new?Cookie("user",?"admin");?
response.addCookie(userCookie);?
和設置有關系的還有以下兩個重要方法?
1.setMaxAge?
設置Cookie過期之前的時間,以秒計。如果不設置該值,則Cookie只在當前會話內有效,而且這些Cookie不會保存到磁盤上。?
注意:刪除cookie就是通過該方法實現的。將要刪除的cookie的過期之前的時間指定為0就可以達到刪除該cookie的目的。?
2.setPath?
設置Cookie適用的路徑。如果不指定路徑,Cookie將返回給當前頁面(JSP頁面或者Servlet的映射)所在目錄及其子目錄下的所有頁面。?
注意:?
A:所有的cookie都是有路徑的?
B:該方法設置的路徑為客戶端路徑,即“/”代表服務器根目錄,而不是WEB應用根目錄?
C:該方法設置路徑時,“/myWeb/”與“/myWeb”是不同的,要特別注意;前者可以關聯到服務器的myWeb目錄下,而或者則不可以。?
D:?該方法設置路徑時,沒有相對目錄可言,即不論在哪個目錄下設置setPath(“/myWeb/”),該cookie都將關聯到服務器的myWeb目錄下?(setPath(“/myWeb”)則不可以),而不是當前目錄的myWeb的子目錄下;同樣,設置setPath(“myWeb/”)和?setPath(“myWeb”)也不能關聯到當前目錄的myWeb的子目錄下?
這里有個奇怪的例子,就是在一個web應用下設置的cookie可以在另一個web應用下獲得(兩個web應用在同一個服務器下)?
目錄結構:在服務器根目錄上有web1和web2兩個目錄,在web1下有setcookie.jsp和getcookie.jsp、在web2下有getcookie.jsp?
web1下的setcookie.jsp?
web1下的getcookie.jsp?
web2下的getcookie.jsp?
先?訪問web1下的setcookie.jsp,然后分別訪問web1和web2下面的getcookie.jsp文件,你會發現奇怪的現象,web1下的?getcookie.jsp中user為空而web2下的getcookie.jsp中user卻有值,這就實現了從一個web應用下設置的cookie?在另一個web應用下獲得。?
大多數人刪除cookie不成功都是因為目錄原因。一個典型的原因是在某一個目錄中設置了cookie(沒有調用setPath方法)卻在另一個目錄中刪除該cookie(其實是調用setMaxAge方法)?
二、讀取?
從?客戶端讀取Cookie時調用的是HttpServletRequest的getCookies方法。該方法返回一個與HTTP請求頭中的內容對應的?Cookie對象數組。得到這個數組之后,一般是用循環訪問其中的各個元素,調用getName檢查各個Cookie的名字,直至找到目標Cookie。?然后對這個目標Cookie調用getValue,根據獲得的結果進行其他處理。?
注意:若JSP和Servlet所在目錄(Servlet為其映射目錄)的父目錄中有同名cookie,則request.getCookie()方法得到的Cookie數組中保存的是其父目錄中的cookie的信息;
轉載于:https://www.cnblogs.com/sallon/archive/2012/07/20/2600671.html
總結
以上是生活随笔為你收集整理的cookies的详细使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: CSS Overflow属性详解(转)
- 下一篇: RichTextBox粘贴两次以及去掉粘
