在上一篇博客中介紹了一下關於cookie的基本知識,下面在這篇博客中給大家介紹一些相對比較高級並且比較
容易犯錯的知識。
一、cookie路徑概念
cookie 一般都是由於用戶訪問頁面而被創建的,可是並不是只有在創建 cookie 的頁面纔可以訪問這個
cookie。默認情況下,只有與創建 cookie 的頁面在同一個目錄或子目錄下的網頁纔可以訪問,這個是因爲安全方面
的考慮,造成不是所有頁面都可以隨意訪問其他頁面創建的 cookie。舉個例子:
在 "http://www.cnblogs.com/Darren_code/" 這個頁面創建一個cookie,那麼在"/Darren_code/"這個路徑下的
頁面如: "http://www.cnblogs.com/Darren_code/archive/2011/11/07/Cookie.html"這個頁面默認就能取到cookie
信息。
可在默認情況下, "http://www.cnblogs.com"或者 "http://www.cnblogs.com/xxxx/" 就不可以訪問這個
cookie(光看沒用,實踐出真理^_^)。
那麼如何讓這個 cookie 能被其他目錄或者父級的目錄訪問類,通過設置 cookie 的路徑就可以實現。例子如
下:
document.cookie = "name=value;path=<span style="color:#ff0000;">path</span>"
document.cookie = "name=value;expires=date;path=<span style="color:#ff0000;">path</span>"
cookie,所有的頁面都可以訪問到了:
document.cookie = "name=Darren;path=/"
這個問題就是我在上一篇博客中提到的問題,在本地是沒有問題的,但是到了測試環境下就獲取不到cookie值了,
因爲在本地我寫測試也和獲取cookie的方法在同一個目錄下面,但是在測試環境下我寫的腳本文件直接嵌入到了別的
頁面中,所以就拿不到cookie的值。
二、Cookie域概念
路徑能解決在同一個域下訪問 cookie 的問題,咱們接着說 cookie 實現同域之間訪問的問題。語法如下:
document.cookie = "name=value;path=path;domain=domain"
紅色的domain就是設置的 cookie 域的值。
例如 "www.qq.com" 與 "sports.qq.com" 公用一個關聯的域名"qq.com",我們如果想讓 "sports.qq.com" 下的
cookie被 "www.qq.com" 訪問,我們就需要用到 cookie 的domain屬性,並且需要把path屬性設置爲 "/"。例:
document.cookie = "username=Darren;path=/;domain=qq.com"
注:一定的是同域之間的訪問,不能把domain的值設置成非主域的域名。
三、cookie的安全性
通常 cookie 信息都是使用HTTP連接傳遞數據,這種傳遞方式很容易被查看,所以 cookie 存儲的信息容易被
竊取。假如 cookie 中所傳遞的內容比較重要,那麼就要求使用加密的數據傳輸。
所以 cookie 的這個屬性的名稱是“secure”,默認的值爲空。如果一個 cookie 的屬性爲secure,那麼它與服
務器之間就通過HTTPS或者其它安全協議傳遞數據。語法如下:
document.cookie = "username=Darren;secure"
把cookie設置爲secure,只保證 cookie 與服務器之間的數據傳輸過程加密,而保存在本地的 cookie文件並不
加密。如果想讓本地cookie也加密,得自己加密數據。
注:就算設置了secure 屬性也並不代表他人不能看到你機器本地保存的 cookie 信息,所以說到底,別把重要
信息放cookie就對了,囧...
四、cookie編碼問題
原本來想在常見問題那段介紹cookie編碼的知識,因爲如果對這個不瞭解的話編碼問題確實是一個坑,所以還
是詳細說說。在輸入cookie信息時不能包含空格,分號,逗號等特殊符號,而在一般情況下,cookie 信息的存儲都
是採用未編碼的方式。所以,在設置 cookie 信息以前要先使用escape()函數將 cookie 值信息進行編碼,在獲取到
cookie 值得時候再使用unescape()函數把值進行轉換回來。如設置cookie時:
document.cookie = name + "="+ escape (value)
再看看基礎用法時提到過的getCookie()內的一句:
return unescape(document.cookie.substring(c_start,c_end))
這樣就不用擔心因爲在cookie值中出現了特殊符號而導致 cookie 信息出錯了。