浅析cookie
原文鏈接:http://caibaojian.com/about-cookie.html
cookie是存儲于訪問者計算機中的變量。每當同一臺計算機通過瀏覽器請求某個頁面時,就會發送這個cookie。你可以使用JavaScript來創建和取回cookie的值。
cookie是訪問過的網站創建文件,用于存儲瀏覽信息,例如個人資料。
從JavaScript的角度看,cookie就是一些字符串信息。這些信息存在客戶端的計算機中,用于客戶端計算機與服務器之間傳遞信息。
在JavaScript中可以通過document.cookie來讀取或者設置這些信息。由于cookie多用在客戶端和服務端之間進行通信,所以除了JavaScript以外,服務器的語言(如PHP)也可以存取cookie。
基礎知識
- cookie是有大小限制的。每個cookie所存放的數據不能超過4k,如果cookie字符串長度超過4k,則該屬性將返回空字符串。
- 由于cookie最終都是以文件形式存放在客戶端計算機中,所以查看和修改cookie都是很方便的,這就是為什么常說cookie不能存放重要信息的原因。
- 每個cookie是存在有效期的。在默認情況下,一個cookie的生命周期就是在關閉瀏覽器的時候結束。如果想要cookie能在瀏覽器關掉之后還可以使用,就必須腰圍cookie設置有效期,也就是cookie的失效日期。
- alert(typeof document.cookie) 結果是string,而不是array。
- cookie有域和路徑這個概念。域就是domain的概念,因為瀏覽器是個注意安全的環境,所以不同的域之間是不能互相訪問cookie的(當然可以通過特殊設置達到cookie跨域訪問)。路徑就是routing的概念,一個網頁所創建的cookie只能被這個網頁在同一目錄或者子目錄下的所有頁面訪問,而不能被其他目錄下的網頁訪問。
- 創建cookie的方式和定義變量的方式有些相似,都需要使用cookie名稱和cookie值。同個網站可以創建多個cookie,而多個cookie可以存放在同一個cookie文件中。
常見問題
- cookie存在兩種類型
- 你瀏覽的當前網站本身設置的cookie
- 來自在網頁上嵌入廣告或圖片等其他域來源的,第三方cookie(網頁可通過使用這些cookie跟蹤你的使用信息)
- cookie的生命周期,大致也兩種狀態:
- 臨時性質的cookie。當前使用的過程中網站會存儲一些你的個人信息,當瀏覽器關閉后這些信息也會從計算機中刪除
- 設置失效時間的cookie。就算瀏覽器關閉了,這些信息依然會在計算機中,如登錄名和密碼,這樣無須每次都到特定站點時都進行登錄,這種cookie可以在計算機中保留幾天,幾個月,甚至幾年
- cookie的兩種清除方式
- 通過瀏覽器工具清除cookie(有第三方工具,瀏覽器自身也有這種功能)
- 通過設置cookie的有效期來清除cookie
- 刪除cookie有時候可能導致某些網頁無法正常運行
- 瀏覽器可以通過設置來接收和拒絕訪問cookie
- 出于功能和性能的原因考慮,建議盡量減少cookie的使用數量,并且盡量使用小cookie
- 關于cookie編碼的細節
基礎用法
簡單的存取操作
使用JavaScript存取cookie時,必須要使用Document對象的cookie屬性;
document.cookie = 'username=yulong'以上代碼’username’表示cookie名稱,’yulong’表示這個名稱對應的值。假設cookie名稱并不存在,那么就是創建一個新的cookie,如果存在就是修改了這個cookie名稱對應的值。如果要多次創建cookie,重復使用這個方法即可。
cookie的讀取操作
要精確的對cookie進行讀取其實很簡單,就是對字符串進行操作。
function getCookie(c_name){ if(document.cookie.length > 0){ c_start = document.cookie.indexOf(c_name + =); if(c_start !== -1){ c_start = c_start + c_name.length + 1; c_end = document.cookie.indexOf(";",c_start); if(c_end == -1){ c_end = document.cookie.length; } return unescape(document.cookie.substring(c_start,c_end)) } } return ""; }當然想實現讀取cookie的方法不少,比如數組,正則等。·
設置cookie的有效期
文章中常常出現的cookie的生命周期也就是有效期和失效期,即cookie的存在時間。在默認的情況下,cookie會在瀏覽器關閉的時候自動清除,但是我們可以通過expires來設置cookie的有效期。
//code from http://caibaojian.com/about-cookie.html document.cookie = "name=yulong;expires=date"上面代碼中的date值為GMT(格林威治時間)格式的日期型字符串,生成方式如下:
var _date = new Date(); _date.setDate(_date.getDate() + 30); _date.toGMTString();分析:
- 通過new 生成一個Date的實例,得到當前時間;
- getDate()方法得到當前本地月份中某一天,接著加上30就是我希望這個cookie能再本地保存30天
- 接著通過setDate()方法設置時間
- 最后用toGMTString()方法把Date對象轉換為字符串,并返回結果
其實設置cookie有很多插件可以用,也可以自己封裝一些現成的方法作為工具函數。
高級篇
路徑概念
cookie有域和路徑的概念,現在介紹路徑在cookie中作用。
cookie一般都是由于用戶訪問頁面而被創建的,可是并不是只有在創建cookie的頁面才可以訪問這個cookie。
默認情況下只有與創建cookie的頁面在同一個目錄或子目錄的網頁才可以訪問,這個是因為安全方面的考慮,造成不適所有頁面都可以隨意訪問其他頁面創建的cookie。
那么如何讓這個cookie能被其他目錄或者父級目錄訪問,通過設置cookie的路徑就可以實現,如:
document.cookie = "name=value;path=path"; document.cookie = "name=value;expires=date;path=path"path就是cookie的路徑,最常用的就是讓cookie在根目錄下,這樣不管是哪個子頁面創建的cookie,所有的頁面都可以訪問了;
document.cookie = "name=yulong;path=/"域概念
路徑能解決在同一個域下訪問cookie的問題,咱們接著說cookie實現同域訪問的問題
document.cookie = "name=yulong;path=path;domain=domain"如果我們有:a:www.qq.com 與 b:sports.qq.com 公共一個關聯域名qq.com
想讓b下的cookie被a訪問,我們就需要用到cookie的domain屬性,并且把path設置成更目錄”/“
一定是同域之間的訪問,不能吧domain的值設置成非主域的域名。
安全性
通常cookie信息都是使用http連接傳遞數據,這種傳遞方式很容易被查看,所以cookie存儲的信息容易被竊取。加入cookie中所傳遞的內容比較重要,那么就要求使用加密的數據傳輸。
所以cookie的這個屬性的名稱是”secure”,默認值為空,如果一個cookie的屬性為secure,那么它與服務器之間的就通過https或者其他安全協議傳遞數據
document.cookie = 'username=yulong;secure'把cookie設置為secure,只保證cookie與服務器之間的數據傳輸過程加密,而保存在本地的cookie文件并不加密。如想讓本地cookie加密,要自己加密。
就算設置了secure屬性也不代表他人不能看到你機器本地保存的cookie信息,所以說到底,別把重要信息放cookie就對了。
編碼細節
在輸入cookie信息時,不能包含空格,分號,逗號等特殊符號,而在一般情況下,cookie信息的存儲都是采用未編碼的方式。所以在設置cookie信息之前,要先使用escape()函數將cookie信息進行編碼,在獲取得到cookie值的時候,再使用unescape()函數把值進行轉換回來,
document.cookie = name = "=" + escape(value)return unescape(docment.cookie.substring(start,end))這樣就不用擔心因為cookie值出現了特殊符號而導致cookie信息報錯了。
來源:前端開發博客
總結
- 上一篇: vs2012打包和部署程序成可安装安装包
- 下一篇: Java 中的位移运算符