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是通過HttpServletResponseaddCookie方法加入到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應用在同一個服務器下) 
目錄結構:在服務器根目錄上有web1web2兩個目錄,在web1下有setcookie.jspgetcookie.jsp、在web2下有getcookie.jsp 
web1下的setcookie.jsp 

web1下的getcookie.jsp 

web2下的getcookie.jsp 

先 訪問web1下的setcookie.jsp,然後分別訪問web1web2下面的getcookie.jsp文件,你會發現奇怪的現象,web1下的 getcookie.jspuser爲空而web2下的getcookie.jspuser卻有值,這就實現了從一個web應用下設置的cookie 在另一個web應用下獲得。 
大多數人刪除cookie不成功都是因爲目錄原因。一個典型的原因是在某一個目錄中設置了cookie(沒有調用setPath方法)卻在另一個目錄中刪除該cookie(其實是調用setMaxAge方法) 

二、讀取 
從 客戶端讀取Cookie時調用的是HttpServletRequestgetCookies方法。該方法返回一個與HTTP請求頭中的內容對應的 Cookie對象數組。得到這個數組之後,一般是用循環訪問其中的各個元素,調用getName檢查各個Cookie的名字,直至找到目標Cookie。 然後對這個目標Cookie調用getValue,根據獲得的結果進行其他處理。 
注意:若JSPServlet所在目錄(Servlet爲其映射目錄)的父目錄中有同名cookie,則request.getCookie()方法得到的Cookie數組中保存的是其父目錄中的cookie的信息;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章