關於瀏覽器cookie的那些事兒


      昨天接到一個小需求,就是在ipad上訪問某頁面,頁面頂部出現一個下載客戶端的提示,點擊關閉按鈕后,提示信息消失,信息存入cookie,在cookie未過期之前,除非用戶自己清除瀏覽器的cookie,否則此提示信息不再顯示。像類似這樣的需求非常常見,而網站上使用cookie技術也比比皆是。今天就抽空整理下關於瀏覽器cookie的那些事兒。有些信息一筆帶過,未做詳細描述。如描述當中有錯誤,歡迎大家指出。

 

1. Cookie介紹

  cookie的傳遞流程是用戶在訪問站點時,服務器端生成cookie,發送給瀏覽器端儲存,當下次再訪問時瀏覽器會將該網站的cookie發回給服務器端,服務器端根據cookie信息顯示特定的內容。簡而言之就是瀏覽器端會儲存你在這個站點的一些信息,比如登錄狀態,用戶ID,密碼、瀏覽過的網頁、停留的時間等信息,記錄在cookie里,方便下次訪問時發送給服務器端。因為HTTP協議是無狀態的,即服務器不知道用戶上一次做了什么,這嚴重阻礙了交互式web應用程序的實現。服務器可以設置或讀取cookie中的信息,借此維護用戶跟服務器會話中的狀態。

  cookie的使用也很普遍,比如說在電商網站中,用戶挑選了商品后,商品信息會記錄在cookie里,然后在購物車頁面讀取cookie里的商品內容。再比如當用戶登錄一個網站時,如果用戶勾選了下次自動登錄,則發送登錄請求時,服務器會發送包含登錄憑據(用戶名和密碼被加密過)的cookie到用戶的硬盤上,則下次登錄時,瀏覽器會發送該cookie到服務器端驗證,這次用戶不必輸入用戶名和密碼就可以直接登錄了。另外網站還可以利用cookie跟蹤統計用戶訪問該網站的習慣,比如什么時間訪問,訪問了哪些頁面,訪問了頁面的哪塊信息,在每個網頁的停留時間等。利用這些信息,一方面是可以為用戶提供個性化的服務,另一方面,也可以作為了解所有用戶行為的工具,對於網站經營策略的改進有一定參考價值。

  cookie是保存在客戶端中,分為內存cookie和硬盤cookie。內存cookie由瀏覽器維護,保存在內存中,瀏覽器關閉就失效。硬盤cookie的存在時間長,有個過期時間,除非手工清理或是到了過期時間,否則不會刪除,將過期時間設置為0或負值,這樣在關閉瀏覽器時,cookie同樣失效。

  cookie的大小限制在4kb左右,所以存放的內容不是很多。cookie在網絡中的應用也有一些弊端,比如會影響到用戶的隱私,安全,以及根據用戶的瀏覽記錄投放垃圾廣告,給用戶造成困擾等。

 

2. Cookie腳本設置

既然cookie在網站中也有不少用處,那如何設置cookie呢?下面簡單介紹下利用JS如何設置cookie。

大致思路為:先讀取document.cookie字符串,保存在自定義的cookie對象里,讀取通過操作自定義的cookie對象來完成,刪除,添加通過重寫document.cookie字符串來操作。

 1 <script>
 2 var __cookies = {},                 // cookie數據緩存   
 3     __date = new Date(),            // cookie涉及的時間處理對象 
 4     __currentms = __date.getTime(), // 當前時間值
 5     __milliseconds = 24*60*60*1000; // 一天的毫秒數值  
 6 
 7 /* 取得cookie字符串
 8  *  @param  {String} _key     KEY值
 9  *  @param  {String} _value   指定的值
10  *  @param  {String} _domain  域
11  *  @param  {Number} _expires 過期時間偏移,單位天
12  *  @param  {String} _path    路徑
13  */
14 var __getCookieStr = function(_key,_value){
15     if(arguments[3]) __date.setTime(__currentms + arguments[3]*__milliseconds);    
16     var _path = arguments[4]?('path='+arguments[4]+';'):'',
17         _expires = arguments[3]?('expires='+__date.toGMTString()+';'):'',
18         _domain = arguments[2]?('domain='+arguments[2]+';'):'';
19     return _key+'='+_value+';'+_domain+_expires+_path;    
20 }; 
21 
22 /*
23  * 添加cookie信息,如果KEY已存在則覆蓋原先內容
24  * @param  {String} _key     KEY值
25  * @param  {String} _value   指定的值
26  * @param  {String} _domain  域
27  * @param  {Number} _expires 過期時間偏移,單位天
28  * @param  {String} _path    路徑
29  * @return {Void}
30  */
31 _$setCookie = function(_key,_value){
32     document.cookie = __getCookieStr.apply(null,arguments);
33     __cookies[_key] = _value;
34 };
35      
36 /* 獲取cookie,根據key值獲取 */
37 _$getCookie = function(_key){
38     return __cookies[_key]||'';
39 };
40 
41 /*
42  * 刪除cookie
43  * @param  {String} _key     要刪除cookie的KEY值
44  * @param  {String} _domain  域
45  * @param  {String} _path    路徑
46  * @return {Void}
47  */
48 _$delCookie = function(_key){
49     document.cookie = __getCookieStr(_key,'',arguments[1],-100,arguments[2]);
50     delete __cookies[_key];
51 };
52 
53 /* 刷新cookie */
54 _$refreshCookie = function(){
55     var _arr = document.cookie.split(/\s*\;\s*/);
56     for(var i=0,l=_arr.length;i<l;i++){
57         __cookies[_arr[i].substring(0,_arr[i].indexOf('='))] = _arr[i].substring(_arr[i].indexOf('=')+1);
58     }
59 };
60 
61 // init
62 _$refreshCookie();
63 </script>


免責聲明!

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



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