Cookie介紹與操作

轉自:http://my.oschina.net/xianggao/blog/83032

一、Cookie簡介

瀏覽器與WEB服務器之間是使用HTTP協議進行通信的;而HTTP協議是無狀態協議。也就是說,當某個用戶發出頁面請求時,WEB服務器只是簡單的進行響應,然後就關閉與該用戶的連接。因此當一個請求發送到WEB服務器時,無論其是否是第一次來訪,服務器都會把它當作第一次來對待,這樣的不好之處可想而知。爲了彌補這個缺陷,Netscape開發出了cookie這個有效的工具來保存某個用戶的識別信息,   它是一種WEB服務器通過瀏覽器在訪問者的硬盤上存儲信息的手段。   它是服務器發送給瀏覽器的體積很小的純文本信息。

定義:cookie是Web瀏覽器存儲的少量命名數據,它與某個特定的網頁和網站關聯在一起。cookie實際上和某一網站和網頁關聯的,保存用戶一定信息的文本文件。

Cookie是當你瀏覽某網站時,網站存儲在你機器上的一個小文本文件,它記錄了你的用戶ID,密碼、瀏覽過的網頁、停留的時間等信息,當你再次來到該網站時,網站通過讀取Cookie,得知你的相關信息,就可以做出相應的動作,如在頁面顯示歡迎你的標語,或者讓你不用輸入ID、密碼就直接登錄等等。你可以在IE的“工具/Internet選項”的“常規”選項卡中,選擇“設置/查看文件”,查看所有保存到你電腦裏的Cookie。這些文件通常是以user@domain格式命名的,user是你的本地用戶名,domain是所訪問的網站的域名。如果你使用NetsCape瀏覽器,則存放在“C:/PROGRAMFILES/NETSCAPE/USERS/”裏面,與IE不同的是,NETSCAPE是使用一個Cookie 文件記錄所有網站的Cookies。

當在瀏覽器地址欄中鍵入了一個Web站點的URL,瀏覽器會向該Web站點發送一個讀取網頁的請求,並將結果在顯示器上顯示。這時該網頁在你的電腦上尋找Amazon網站設置的Cookie文件,如果找到,瀏覽器會把Cookie文件中的數據連同前面輸入的URL一同發送到Amazon服務器。服務器收到Cookie數據,就會在他的數據庫中檢索你的ID,你的購物記錄、個人喜好等信息,並記錄下新的內容,增加到數據庫和Cookie文件中去。如果沒有檢測到Cookie或者你的Cookie信息與數據庫中的信息不符合,則說明你是第一次瀏覽該網站,服務器的CGI程序將爲你創建新的ID信息,並保存到數據庫中。 Cookie是利用了網頁代碼中的HTTP頭信息進行傳遞的,瀏覽器的每一次網頁請求,都可以伴隨Cookie傳遞,例如,瀏覽器的打開或刷新網頁操作。服務器將Cookie添加到網頁的HTTP頭信息中,伴隨網頁數據傳回到你的瀏覽器,瀏覽器會根據你電腦中的Cookie設置選擇是否保存這些數據。如果瀏覽器不允許Cookie保存,則關掉瀏覽器後,這些數據就消失。Cookie在電腦上保存的時間是不一樣的,這些都是由服務器的設置不同決定得。Cookie有一個Expires(有效期)屬性,這個屬性決定了Cookie的保存時間,服務器可以通過設定Expires字段的數值,來改變Cookie的保存時間。如果不設置該屬性,那麼Cookie只在瀏覽網頁期間有效,關閉瀏覽器,這些Cookie自動消失,絕大多數網站屬於這種情況。通常情況下,Cookie包含Server、Expires、Name、value這幾個字段,其中對服務器有用的只是Name和value字段,Expires等字段的內容僅僅是爲了告訴瀏覽器如何處理這些Cookies。

二、Cookie屬性

除名字與值外,每個cookie有四個可選屬性:

1.expires:指定cookie的生存期。默認情況下cookie是暫時的,瀏覽器關閉就失效。 

2.path:它指定了與cookie關聯在一起的網頁。默認是在和當前網頁同一目錄的網頁中有效。   如果把path設置爲"/",那麼它對該網站的所有網頁都可見了。 

3.domain:設定cookie有效的域名,   如果把path設置爲"/",把domain設爲".sohu.com",那麼 A.sohu.com和B.sohu.com   的所有網頁都能夠訪問此cookie。

4.secure:布爾值,它指定了網絡上如何傳輸cookie。默認情況下,cookie是不安全的,   可以通過一個不安全的,普通的HTTP協議傳輸;若設置cookie爲安全的,那麼它將   只在瀏覽器和服務器通過HTTPS或其它的安全協議連接在一起時才被傳輸。

三、Cookie操作

Cookie可以用Javascript來操作,也可以用JSP來操作。

Javascript操作Cookie:

//設置cookie,cookie有效期時間爲GMT時間(距1970年1月1日臨時的毫秒)   
//例如可以設置setCookie("password","12345",(3600000*24*180)),180有效   
function setCookie(name, value, expires) { 
    var expdate = new Date(); 
    expdate.setTime(expdate.getTime() + expires); 
    document.cookie = name + "=" + escape(value) + "; 
    expires=" + expires.toGMTString() + "; 
    path=/"; 

//根據cookie名,取得cookie值   
function getCookie(name) { 
    var search; 
    search = name + "="; 
    offset = document.cookie.indexOf(search); 
    if (offset != -1) { 
        offset += search.length; 
        end = document.cookie.indexOf(";", offset); 
        if (end == -1) end = document.cookie.length; 
        return (document.cookie.substring(offset, end)); 
    } else return ""; 

//刪除某一cookie   
function deleteCookie(name) { 
    var expdate = new Date(); 
    expdate.setTime(expdate.getTime() - (3600 * 24 * 1000 * 1)); 
    setCookie(name, "", expdate); 

//檢查是否存在此cookie   
function checkCookie(cookieName, cookieValue) { 
    if (getCookie(cookieName) == cookieValue) { 
        return true; 
    } else { 
        return false; 
    } 
}

Jsp操作Cookie:java中有個Cookie類:javax.servlet.http.Cookie

import javax.servlet.http.*; 
public class ComCookie { 
    private Cookie[] cookies; 
    private Cookie cookie; 
    public ComCookie(Cookie[] cs){ 
         cookies = cs; 
    }  
    public String getCookieValue(String cookieName,String defaultValue) { 
         for(int i=0; i  cookies.length; i++) { 
             Cookie cookie = cookies[i]; 
             if(cookieName.equals(cookie.getName()))  return(cookie.getValue()); 
         } 
         return(defaultValue); 
    }  
    public static String getCookieValue(Cookie[] cookies, String cookieName, String defaultValue) { 
        for(int i=0; i < cookies.length; i++) { 
             Cookie cookie = cookies[i]; 
             if(cookieName.equals(cookie.getName()))  return(cookie.getValue()); 
        } 
        return(defaultValue); 
    }

}

JSP是使用如下的語法格式來創建cookie的:

Cookie cookie_name =new Cookie("Parameter","Value");

例如:Cookie newCookie =new Cookie("username","waynezheng"); response.addCookie(newCookie);

解釋:JSP是調用Cookie對象相應的構造函數Cookie(name,value)用合適的名字和值來創建Cookie,然後 Cookie可以通過HttpServletResponse的addCookie方法加入到Set-Cookie應答頭,本例中Cookie對象有兩個字符串參數:username,waynezheng。注意,名字和值都不能包含空白字符以及下列字符: @ : ;? , " / [ ] ( ) =

處理Cookie屬性:

在JSP中,程序是通過cookie.setXXX設置各種屬性,用cookie.getXXX讀出cookie的屬性,現把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,然後用addCookie方法發送一個HTTP Header。  JSP將調用request.getCookies()從客戶端讀入Cookie,getCookies()方法返回一個HTTP請求頭中  的內容對應的Cookie對象數組。你只需要用循環訪問該數組的各個元素,調用getName方法檢查各個Cookie的名字,至找到目標Cookie,然後對該Cookie調用getValue方法取得與指定名字關聯的值。

例如:

<%

String userName=request.getParameter("username");//從提交的HTML表單中獲取,用戶名

Cookie theUsername=new Cookie("username",userName);//以"username",userName值/對創建一個Cookie

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);

deleteNewCookie.setPath("/");

response.addCookie(deleteNewCookie);

%>

Jsp設置頁面過期

服務端方法:

<%

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires", -10);

%>

在登陸頁面和登陸後頁面均加入這段代碼即可注意,一定要在登陸頁面(或類似功能的頁面使session無效)

客戶端方法:

meta是用來在HTML文檔中模擬HTTP協議的響應頭報文。meta 標籤用於網頁的<head>與</head>中,meta 標籤的用處很多。meta 的屬性有兩種:name和http-equiv。name屬性主要用於描述網頁,對應於content(網頁內容),以便於搜索引擎機器人查找、分類(目前幾乎所有的搜索引擎都使用網上機器人自動查找meta值來給網頁分類)。這其中最重要的是description(站點在搜索引擎上的描述)和keywords(分類關鍵詞),所以應該給每頁加一個meta值。

比較常用的有以下幾個:

name 屬性:

1、<meta name="Generator" contect="">用以說明生成工具(如Microsoft FrontPage 4.0)等;

2、<meta name="KEYWords" contect="">向搜索引擎說明你的網頁的關鍵詞;

3、<meta name="DEscription" contect="">告訴搜索引擎你的站點的主要內容;

4、<meta name="Author" contect="你的姓名">告訴搜索引擎你的站點的製作的作者;

5、<meta name="Robots" contect= "all|none|index|noindex|follow|nofollow">

其中的屬性說明如下:設定爲all:文件將被檢索,且頁面上的鏈接可以被查詢; 設定爲none:文件將不被檢索,且頁面上的鏈接不可以被查詢;設定爲index:文件將被檢索; 設定爲follow:頁面上的鏈接可以被查詢;設定爲noindex:文件將不被檢索,但頁面上的鏈接可以被查詢;設定爲nofollow:文件將不被檢索,頁面上的鏈接可以被查詢。

http-equiv屬性:

1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80">和 <meta http-equiv="Content-Language" contect="zh-CN">用以說明主頁製作所使用的文字以及語言;又如英文是ISO-8859-1字符集,還有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集;

2、<meta http-equiv="Refresh" contect="n;url=http://yourlink">定時讓網頁在指定的時間n內,跳轉到頁面http;//yourlink;

3、<meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT">可以用於設定網頁的到期時間,一旦過期則必須到服務器上重新調用。需要注意的是必須使用GMT時間格式;

4、<meta http-equiv="Pragma" contect="no-cache">是用於設定禁止瀏覽器從本地機的緩存中調閱頁面內容,設定後一旦離開網頁就無法從Cache中再調出;

5、<meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00 GMT">cookie設定,如果網頁過期,存盤的cookie將被刪除。需要注意的也是必須使用GMT時間格式;

6、<meta http-equiv="Pics-label" contect="">網頁等級評定,在IE的internet選項中有一項內容設置,可以防止瀏覽一些受限制的網站,而網站的限制級別就是通過meta屬性來設置的;

7、<meta http-equiv="windows-Target" contect="_top">強制頁面在當前窗口中以獨立頁面顯示,可以防止自己的網頁被別人當作一個frame頁調用;

8、<meta http-equiv="Page-Enter" contect="revealTrans(duration=10,transtion= 50)">和<meta http-equiv="Page-Exit" contect="revealTrans(duration=20,transtion =6)">設定進入和離開頁面時的特殊效果,這個功能即FrontPage中的“格式/網頁過渡”,不過所加的頁面不能夠是一個frame頁面。

 

1.設置Cookie

Cookie cookie = new Cookie("key", "value");

cookie.setMaxAge(60); //設置60秒生存期,如果設置爲負值的話,則爲瀏覽器進程Cookie(內存中保存),關閉瀏覽器就失效。

cookie.setPath("/test/test2"); //設置Cookie路徑,不設置的話爲當前路徑(對於Servlet來說爲request.getContextPath() + web.xml裏配置的該Servlet的url-pattern路徑部分)

response.addCookie(cookie);

2.讀取Cookie

該方法可以讀取當前路徑以及“直接父路徑”的所有Cookie對象,如果沒有任何Cookie的話,則返回null

Cookie[] cookies = request.getCookies();

3.刪除Cookie

Cookie cookie = new Cookie("key", null);

cookie.setMaxAge(0); //設置爲0爲立即刪除該Cookie

cookie.setPath("/test/test2"); //刪除指定路徑上的Cookie,不設置該路徑,默認爲刪除當前路徑Cookie

response.addCookie(cookie);

4.注意:假設路徑結構如下

test/test2/test345/test555/test666

a.相同鍵名的Cookie(值可以相同或不同)可以存在於不同的路徑下。

b.刪除時,如果當前路徑下沒有鍵爲"key"的Cookie,則查詢全部父路徑,檢索到就執行刪除操作(每次只能刪除一個與自己最近的父路徑Cookie)。

c.必須指定與設定cookie時使用的相同路徑來刪除改cookie,而且cookie的鍵名不論大寫、小寫或大小混合都要指定路徑。

d.鍵名小寫時,如果當前路徑爲/test/test2,如果找不到再向上查詢/test、/test555、/test345,如果還找不到就查詢/ 。(/test555/test666不查詢)。

e.鍵名大小寫混合或大寫時,不指定路徑則默認刪除當前路徑,並且不向上查詢。

f.讀取Cookie時只能讀取直接父路徑的Cookie。

g.如果當前路徑爲/test/test2,要讀取的鍵爲"key"。當前路徑讀取後,還要讀取/test,/test讀取後,還要讀取/

h.在做Java的web項目時,由於一般的Web服務器(如Tomcat或Jetty)都用Context來管理不同的Web Application,這樣對於每個Context有不同的Path,在一個Server中有多個Web Application時要特別小心,不要設置Path爲/的Cookie,容易誤操作。(當然前提是域名相同)

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