JavaScript本地儲存(1):cookie在前端


  以前心里總是默念着這句:“知道資源在哪兒就是成功的一半”。對於很多知識的學習,好像也一直停留在知道它在哪兒的地步,看來現在需要有所改變了!

  那就從cookie開始吧~

  Cookie(復數形態Cookies),中文名稱為小型文本文件小甜餅,指某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端(Client Side)上的數據(通常經過加密)。定義於RFC2109(已廢棄),最新取代的規范是RFC2965

Clasification [分類]

  說到底,cookie就是保存在客戶端的一段字符串(注意:不是數組)。

  cookie可以手動設置,也可以由服務器產生,當客戶端(瀏覽器)向服務器發送請求,服務器會反饋一些信息給客戶端,這些信息的key/value值被瀏覽器作為文件保存在客戶端特定的文件夾中。

  1.內存Cookie

    內存Cookie由瀏覽器維護,保存在內存中,瀏覽器關閉后就消失了,其存在時間是短暫的。

  2.磁盤Cookie

     硬盤Cookie保存在硬盤里,有一個過期時間,除非用戶手工清理或到了過期時間,硬盤Cookie不會被刪除,其存在時間是長期的。

 

Arguments [參數]

 
屬  性  名 描    述
String name 該Cookie的名稱。Cookie一旦創建,名稱便不可更改
Object value 該Cookie的值。如果值為Unicode字符,需要為字符編碼。如果值為二進制數據,則需要使用BASE64編碼
int maxAge 該Cookie失效的時間,單位秒。如果為正數,則該Cookie在maxAge秒之后失效。如果為負數,該Cookie為臨時Cookie,關閉瀏覽器即失效,瀏覽器也不會以任何形式保存該Cookie。如果為0,表示刪除該Cookie。默認為–1
boolean secure 該Cookie是否僅被使用安全協議傳輸。安全協議。安全協議有HTTPS,SSL等,在網絡上傳輸數據之前先將數據加密。默認為false
String path 該Cookie的使用路徑。如果設置為“/sessionWeb/”,則只有contextPath為“/sessionWeb”的程序可以訪問該Cookie。如果設置為“/”,則本域名下contextPath都可以訪問該Cookie。注意最后一個字符必須為“/”
String domain 可以訪問該Cookie的域名。如果設置為“.google.com”,則所有以“google.com”結尾的域名都可以訪問該Cookie。注意第一個字符必須為“.”
String comment 該Cookie的用處說明。瀏覽器顯示Cookie信息的時候顯示該說明
int version 該Cookie使用的版本號。0表示遵循Netscape的Cookie規范,1表示遵循W3C的RFC 2109規范

 

Detail [參數詳解]

  1。key/value

1 document.cookie  = 'username=木子Vs立青'

  很簡單吧,cookie是document的一個屬性,在控制台,console.log(document.cookie)可以看到該域名下的cookie值。設置方式就是key=value.

  如何已經存在了username這個key,再次如上操作就是修改value值了。

  2.maxAge

1 var date = new Date();
2 
3 date.setDate(date.getDate()+30);
4 date.toGMTString();
5 
6 document.cookie = "name=value;expires=date"

  expires這個參數是用來設置cookie有效期的,如果將expires設置成一個過去的時間(相對本機系統時間),相應的cookie就被刪除,當然也可以手動來刪除cookie~

  上面給出的例子是以天為單位計算的,如果要改成其他的計時方式,可以修改第三行date.setDate(date.getDate()+30),為30天。比如要改成按小時計算:date.setHours(date.getHours()+30),為30小時。

  3.path

1 document.cookie = "name=value;expires=date;path=path"

   這里的path如何理解?比如在http://www.cnblogs.com/hustskyking/下創建一個cookie(即path=/hustskyking/),那么在http://www.cnblogs.com/hustskyking/下所有子目錄都是可以訪問這個cookie的;再比如path=/,意思就是在http://www.cnblogs.com/下的任何子目錄都是訪問到這個cookie的。

  4.domain

1 document.cookie = "name=value;path=path;expires=date;domain=domain"

  這里要說的是同域訪問,比如在a.example.com和b.example.com下共享c.example.com下的cookie文件,只需如此這般...

1 document.cookie = "name=value;path=path;expires=date;domain=example.com"

  你應該懂了~

  5.secure

   我們知道在網絡中建立連接傳輸數據有兩種常見的方式,一個鍾是http,另一種是https,后者是加密傳輸。大家從上面也可以看出,cookie很容易被竊取,通過下面這個方式可以為cookie加一把安全鎖。

1 document.cookie = "username=木子Vs立青;secure"

  加了secure(默認值為空),之后,cookie提交到服務器時使用的是https傳輸。當然這只是加了一層防護,不等於我愛羅的絕對防御~

 

Attention [注意事項]

  1.value值保護

1 document.cookie = name + "="+ escape (value);

  我們通常會用escape將value進行編碼,取回的時候用unescape()函數就行了。

  2.重要信息就不要放到cookie值中了~

 

Class [封裝cookie方法的類]

  1、創建Cookie對象

1 //因為是作為類名或者命名空間的使用,所以和Math對象類似,這里使用Cookie來表示該對象
2 var Cookie = new Object();


  2、實現設置Cookie的方法

 1 //name是要設置cookie的名稱;value是設置cookie的值,option包括了其它選項,是一個對象作為參數
 2 Cookie.setCookie = function(name, value, option) {
 3   //用於存儲賦值給document.cookie的cookie格式字符串
 4   var str = name+"="+escape(value);
 5   if(option) {
 6     //如果設置了過期時間
 7      if(option.expireDays) {
 8       var date = new date();
 9       var ms = option.expireDays*24*3600*1000;
10       date.setTime(date.getTime()+ms);
11       str += "; expires="+date.toGMTString();
12     }
13     if(option.path) str += "; path="+path;//設置訪問路徑
14      if(option.domain) str += "; domain="+domain;//設置訪問主機
15      if(option.secure) str += "; true";//設置安全性
16   }
17   document.cookie = str;
18 }

  3、實現取Cookie的方法

 1 //name是指定cookie的名稱,從而根據名稱返回相應的值
 2 Cookie.getCookie = function(name) {
 3   var cookieArray = document.cookie.split("; ");//得到分割的cookie名值對
 4   var cookie = new Object();
 5   for(var i=0; i<cookieArray.length; i++) {
 6     var arr = cookieArray[i].split("=");//將名和值分開
 7      if(arr[0]==name) return unescape(arr[1]);//如果是指定的cookie,則返回它的值
 8   }
 9   return "";
10 }

  4、實現刪除Cookie的方法

 1 //name是指定cookie的名稱,從而根據這個名稱刪除相應的cookie。在實現中,刪除cookie是通過調用setCookie來完成的,將option的expireDays屬性指定為負數即可
 2 Cookie.deleteCookie = function(name) {
 3   this.setCookie(name, "", {expireDays:-1});//將過期時間設置為過去來刪除一個cookie
 4 }
 5 //通過下面的代碼,整個Cookie對象創建完畢后,可以將其放到一個大括號中來定義:
 6 var Cookie = {
 7    setCookie:function(){},
 8    getCookie:function(){},
 9    deleteCookie:function(){}
10 }
11 
12 //通過這種形式,可以讓Cookie的功能更加清晰,它作為一個全局對象,大大方便了對Cookie的操作
13 Cookie.setCookie("user", "terry");
14 Cookie.deleteCookie("user");

 

Substitution [cookie的替代品]

  cookie 是有大小限制的,每個 cookie 所存放的數據不能超過4kb,如果 cookie 字符串的長度超過4kb,則該屬性將返回空字符串。

  如果我們需要在客戶端儲存比較大容量的數據,怎么辦?選擇cookie肯定是不明智的,下次會給大家詳細說明userData和localStorage。

  userData(windows+IE平台): 128Kb

  localStorage(現代瀏覽器):  5M

 

 Related blog [相關博文]

  JavaScript本地儲存(2):userData和localStorage

  Javascript本地儲存(3):離線web應用

 

Reference [參考資料]

  1.百度文庫

  2.wiki

  3.聶微東博客

  4.alixixi


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM