Javascript操纵Cookie--转
引用地址:http://www.imkevinyang.com/2009/06/javascript%E6%93%8D%E7%BA%B5cookie.html
在講如何使用Javascript操縱Cookie時(shí),我們先來了解一下Cookie的基本常識(shí)。
Cookie,又稱Http Cookie,是存儲(chǔ)在客戶端本地的一小段信息。我們可以簡單地把Cookie理解為客戶端瀏覽器上的一個(gè)小硬盤,我們會(huì)在上面存取一些信息,通常用作Http狀態(tài)的維護(hù),現(xiàn)在也經(jīng)常被用作跟蹤用戶行為的一種常見方式。
Session cookies?- these are temporary and are erased when you close your browser at the end of your surfing session. The next time you visit that particular site it will not recognise you and will treat you as a completely new visitor as there is nothing in your browser to let the site know that you have visited before。
Persistent cookies?- these remain on your hard drive until you erase them or they expire. How long a cookie remains on your browser depends on how long the visited website has programmed the cookie to last。
Cookie的屬性
每一個(gè)Cookie都有如下幾個(gè)屬性:
- 名稱????
- 值
- 主機(jī)域
- 路徑
- 安全級別
- 過期時(shí)間
其中“名稱”、“主機(jī)域”,“路徑”三者一起唯一標(biāo)識(shí)了一個(gè)Cookie。?
大多數(shù)Cookie在設(shè)置的時(shí)候都只是顯式的設(shè)置了Cookie的名稱和值,這種情況下,瀏覽器會(huì)自動(dòng)的使用location.host來設(shè)置Cookie的主機(jī)域,將路徑設(shè)置到根目錄“/”下。例如,當(dāng)你在www.example.com上面使用document.cookie="name=value"設(shè)置了一個(gè)Cookie,那么這個(gè)Cookie就擁有了如下屬性:
- 名稱 —— name
- 值 —— value
- 主機(jī)域 —— www.example.com
- 路徑 —— /
- 安全級別 —— No
- 過期時(shí)間 —— 瀏覽器會(huì)話結(jié)束(關(guān)閉瀏覽器)
第一方和第三方Cookie的區(qū)別
第一方Cookie指的是設(shè)置在當(dāng)前網(wǎng)站域上面的Cookie,而第三方Cookie指的是設(shè)置在其他域上的Cookie。
第一方Cookie比較好理解,我們通常遇到的都是屬于第一方Cookie。在客戶端Javascript中,我們只能操縱第一方Cookie,也就是說,我們不能在www.example.com主機(jī)上,設(shè)置www.google.cn的Cookie,這樣就亂套了。
第三方Cookie不容易讓人注意到。假設(shè)我們在公司網(wǎng)站www.example.com上面使用了map.google.com的地圖服務(wù),而Google地圖在使用時(shí)又希望在用戶這邊設(shè)置一些Cookie,就跟用戶直接訪問自家網(wǎng)站(map.google.com)一樣,如Session信息等,那么它會(huì)在返回的HTTP Response中包含set-cookie的報(bào)頭,但由于是第三方域,存在安全問題,所以必須還在響應(yīng)中包含一個(gè)P3P的主機(jī)頭(P3P頭中存的是隱私策略的摘要)來實(shí)現(xiàn)Cookie的第三方存取(注意,此時(shí)Cookie還是設(shè)置在b.com上面的)。IE中可以設(shè)置對第三方Cookie存取的限制。
Javascript操縱Cookie
在客戶端使用Javascript操縱Cookie存在很多的不便之處,例如在讀取Cookie的時(shí)候,只能通過手動(dòng)解析document.cookie字符串得到指定cookie的值,不能得到其他任何信息,如設(shè)置的主機(jī),路徑以及過期時(shí)間等。
| /** ?* 查詢指定名稱的Cookie值 ?* @note 需要注意有可能出現(xiàn)同名cookie的問題 ?* @param {Object} key ?* @param {Object} 設(shè)置當(dāng)讀取不到key時(shí)返回的默認(rèn)值 ?* @return {String} 返回讀取到的Cookie的值, ?* 如果讀取不到相應(yīng)的Cookie,則判斷defValue是否有效,有效則返回defValue,否則返回null ?*/ function getCookie(key,defValue){ ????var cookie,value; ????if(!key){ ????????return null; ????} ????? ????cookie = document.cookie; ????// 所有cookie的key都小寫化處理 ????key = key.toLowerCase(); ????? ????value = find(cookie,key+"=",";",null,false,null); ????return value === null ? defValue : unescape(value); } /** ?* 設(shè)置cookie ?* @param {String} key ?* @param {String} value ?* @param {Number} expires 單位為秒 ?* @param {String} path 路徑 ?* @param {String} domain 主機(jī) ?* @param {Boolean} secure 安全級別 ?*/ function setCookie(key, value, expires, path,domain,secure){ ????// key無效則不做任何操作 ????if(!key){ ????????return; ????} ????? ????// 所有cookie的key都小寫化處理 ????key = key.toLowerCase(); ????? ????key = key + '=' + escape(value) + ";"; ????expires = expires ? ("expires=" + new Date(new Date().getTime() + expires * 1000).toGMTString()) + ";" : ""; ????path = !!path ? "path=" + path + ";" : "path=/;"; ????domain = domain ? ("domain=" + domain) + ";" : ""; ????secure = secure ? "secure=true;" : ""; ????document.cookie =[key,expires,path,domain,secure].join(""); } /** ?* 刪除指定Cookie ?* @param {Object} key ?* @param {Object} path ?* @param {Object} domain ?*/ function delCookie(key,path,domain){ ????// 超時(shí)設(shè)置為過去的時(shí)間,cookie會(huì)立即失效 ????key = key.toLowerCase(); ????setCookie(key,"",-1000,path,domain);??? } /** ?* 從字符串中獲取夾在指定前綴和后綴之間的值 ?* @example ?* userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.2) Gecko/2008082714 Firefox/3.0.2" ?* ?* prefix="windows nt" ?* suffix=";" ?* find(userAgent,prefix,suffix) returns " 5.2"; ?* @param {Object} str 源字符串 ?* @param {Object} prefix 前綴 ?* @param {Object} suffix 結(jié)束符,若不指定,則匹配到字符串結(jié)尾;如果指定了,但是匹配不到,則同樣匹配到字符串結(jié)尾。 ?* @param {Boolean} matchFirstOnly 是否找到第一個(gè)匹配項(xiàng),設(shè)置為false則查找最后一個(gè)匹配項(xiàng),默認(rèn)為false ?* @param {Boolean} ignoreCase???? 忽略大小寫來查找,默認(rèn)值為true ?* @param {Boolean} trimBlank 是否刪除值首尾的空白符,默認(rèn)值為true ?* @return {String} 查找到的字符串,若找不到則返回null ?*/ function find(str,prefix,suffix,matchFirstOnly,ignoreCase,trimBlank){ ????var start,end,middle,value=null; ????matchFirstOnly = (matchFirstOnly === true); ????ignoreCase = (ignoreCase !== false); ????trimBlank = (trimBlank !== false); ????// 如果忽略默認(rèn)值 ????if(ignoreCase){ ????????str = str.toLowerCase(); ????????prefix = prefix.toLowerCase(); ????????suffix = suffix && suffix.toLowerCase(); ????} ????? ????if(matchFirstOnly){ ????????start = str.indexOf(prefix); ????}else{ ????????start = str.lastIndexOf(prefix); ????}??????? ????if (start > -1) { ????????// 如果沒有指定后綴,則直接匹配到字符串結(jié)尾 ????????middle = start + prefix.length; ????????if (!suffix) { ????????????value = str.substring(middle); ????????} ????????else { ????????????end = str.indexOf(suffix, middle); ????????????if (end > -1) { ????????????????value = str.substring(middle, end); ????????????} ????????????else { ????????????????value = str.substring(middle); ????????????} ????????} ????????if(trimBlank){ ????????????value = value.replace(/^\s*(.*?)\s*$/, '$1'); ????????}??? ????} ????? ????return value; } |
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3585898.html
總結(jié)
以上是生活随笔為你收集整理的Javascript操纵Cookie--转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java使用jsp servlet来防止
- 下一篇: 深入分析 Linux 内核链表--转