詳細介紹JavaScript中的cookie
以前,JavaScript完全不與服務器進行任何交互。它有時在客戶端進行少量操作,然后讓服務器來完成其他任務。然而,隨著Web的發展,也要求JavaScript能向服務器發送數據,接受響應,在這種需求下就產生兩種與服務器通信的方法:cookie與HTTP請求。
cookie其實就是網站放在用戶機器上的一小塊信息,cookie對于用戶來說是唯一的,網站可判斷用戶上次訪問網站的時間,以及他訪問了哪些頁面,可用于在某個網站跟蹤你訪問的頁面,但無法用它來獲取個人信息。cookie是第一個JavaScript可以利用的客戶端—服務器端之間的交互手段。瀏覽器向服務器發送請求時,為這個服務器存儲的cookie會與其他信息一起發送到服務器。
(一) cookie的組成
1、名稱
每一個cookie由一個唯一的名稱代表。這個名稱可以包含字母、數字和下劃線。與JavaScript的變量不同,cookie的名稱是不區分大小寫的。建議將cookie名字認為是區分大小寫的,因為有些服務器端軟件是區分大小寫的。
2、值
保存在cookie中的字符串值。這個值在存儲之前必須用encodeURIComponent()對其進行編碼,以免丟失了數據或占用了cookie。名稱和值加起來的字節數不能超過4KB。
3、域
出于安全考慮,網站不能訪問由其他域創建的cookie。創建cookie后,域的信息會作為cookie的一部分存儲起來。
4、路徑
另一個cookie的安全特性,路徑限制了對Web服務器上的特定目錄的訪問。例如,可指定cookie只能從http://www.yiiiyaa.net/category中訪問,這樣就不能訪問http://www.yiiyaa.net/上的網頁了,盡管都在同一個域中。
5、失效日期
cookie何時應該被刪除。默認情況下,關閉瀏覽器,時即將cookie刪除;不過,也可以自己設置刪除時間。這個值是GMT格式的日期,用于指定應該刪除cookie的準確時間。因此,cookie可以瀏覽器關閉后依然保存在用戶的機器上。如果你設置的失效日期是個以前的時間,則cookie被立即刪除。
6、安全標志
一個true/false值,用于表示cookie是否只能從安全網站(使用SSL和https協議的網站)中訪問。可以將這個值設置為true以提供加強的保護,進而確保cookie不被其他網站訪問。
(二)其他安全限制
為確保cookie不被惡意使用,瀏覽器還對cookie的使用進行了一些限制:
1、每個域最多只能在一臺用戶的機器上存儲20個cookie;
2、每個cookie的總大小不能超過4096節點;
3、一臺用戶機器上的cookie的總數不能超過300個。
另外,一些新的瀏覽器還對cookie進行了嚴格控制,可以讓用戶阻止所有的cookie、阻止某些未知的網站的cookie或者在創建cookie時進行提示。
(三) JavaScript中的cookie
document對象有cookie特性,是包含所有給定頁面可訪問的cookie的字符串。cookie特性也很特別,因為將這個cookie特性設置為新值只會改變對頁面可訪問的cookie,并不會真正改變cookie(特性)本身。
要創建一個cookie,必須按照下面的格式創建字符串:
- cookie_name=cookie_value;
- expires=expiration_time;
- path=domain_path;
- domain=domain_name;
secure只有字符串的第一部分(指定名稱和值的字符串)是對設置cookie必需的,其他部分都是可選的,然后將這個字符串復制給document.cookie特性,即可創建cookie。讀取document.cookie的值即可訪問這些cookie,以及所有其他可以從給定頁面訪問的cookie。
因為創建和讀取cookie均需記住它的格式,大部分開發人員用函數用處理這些細節。創建cookie的函數很簡單。
- function setCookie(sName,sValue,oExpires,sPath,sDomain,bSecure){
- var sCookie=sName+”=”+encodeURIComponent(sValue);
- if(oExpires){
- sCookie+=”; expires=”+oExpires.toGMTString();
- }
- if(sPath){
- sCookie+=”; path=”+sPath;
- }
- if(sDomain){
- sCookie+=”; domain=”+sDomain;
- }
- if(bSecure){
- sCookie+=”; secure”;
- }
- document.cookie=sCookie;
- }
這個函數可以根據傳入的參數建立cookie字符串。因為只有前兩個參數是必需的。所以函數在把參數傳給cookie字符串前,要對參數進行檢測,以確保前兩個參數是存在的。
下一個函數getCookie(),通過傳入的名稱獲取cookie的值:
- function getCookie(sName){
- var sRE=”(?:; )?”+sName+”=([^;]*);?”;
- var oRE=new RegExp(sRE);
- if(oRE.test(document.cookie)){
- return decodeURIComponent(RegExp[“$1”]);
- }else{
- return null;
- }
- }
這個函數使用了通過cookie名稱建立的正則表達式。由于cookie字符串的格式,正則表達式是從document.cookie中抽取特定值最方便的方法。如果只有一個cookie,字符串就只有一個名稱和值,而值就是等于號后面的所有字符,如果后面還有cookie,則用分號進行分隔,也就是說cookie的值包含等于號之后,分號之前的所有字符串。
最后一個函數deleteCookie(),用于從系統中立即刪除一個cookie。將cookie的失效時間設置為過去的一個時間即可實現。
- function deleteCookie(sName,sPath,sDomain)
- {
- setCookie(sName,””,new Date(0),sPath,sDomain);
- }
有了以上這些函數,就可以很方便的地設置、讀取、設置cookie了。
本文地址:http://www.yiiyaa.net/
【編輯推薦】