# javascript快速入門20--Cookie
## Cookie 基礎知識
我們已經知道,在 document 對象中有一個 cookie 屬性。但是 Cookie 又是什么?“某些 Web 站點在您的硬盤上用很小的文本文件存儲了一些信息,這些文件就稱為 Cookie。”—— MSIE 幫助。一般來說,Cookies 是 CGI 或類似,比 HTML 高級的文件、程序等創建的,但是 JavaScript 也提供了對 Cookies 的很全面的訪問權利。
在繼續之前,我們先要學一學 Cookie 的基本知識。
每個 Cookie 都是這樣的:cookie名=cookie值;cookie本身僅僅是一個字符串,是一組名值對;多組名值對用分號加空格分隔!
"cookie名"的限制與 JavaScript 的命名限制大同小異,少了“不能用 JavaScript 關鍵字”,多了“只能用可以用在 URL 編碼中的字符”。后者比較難懂,但是只要你只用字母和數字命名,就完全沒有問題了。“值”的要求也是“只能用可以用在 URL 編碼中的字符”。
每個 Cookie 都有失效日期,一旦電腦的時鐘過了失效日期,這個 Cookie 就會被刪掉。我們不能直接刪掉一個 Cookie,但是可以用設定失效日期早于現在時刻的方法來間接刪掉它。
每個網頁,或者說每個站點,都有它自己的 Cookies,這些 Cookies 只能由這個站點下的網頁來訪問,來自其他站點或同一站點下未經授權的區域的網頁,是不能訪問的。每一“組”Cookies 有規定的總大小(大約 2KB 每“組”),一超過最大總大小,則最早失效的 Cookie 先被刪除,來讓新的 Cookie“安家”。
## 訪問Cookie
```
document.write(document.cookie);//輸出類似"name1=value1; name2=value2; name3=value3"的字符串
document.write(typeof document.cookie);//cookie僅僅是個字符串
```
但這樣獲取到的是一堆混亂的字符串,必須對其進行處理才能知道它的含義!在類似ASP或PHP這樣的服務器端腳本中,往往設置cookie十分簡單
```
//ASP
response.cookies("cookieName")="cookieValue"
//PHP
setcookie("cookieName","cookieValue");
```
### 解析Cookie名值對
方案一:直接截取字符串
```
function getCookie(cookieName) { var start = document.cookie.indexOf(cookieName+"="); if (start ==-1) {return "";}
start = start+cookieName.length+1; var end = document.cookie.indexOf(";",start); if (end=-1) {end = document.cookie.length;} return document.cookie.substring(start,end);
}
```
方案二:將Cookie拆分為數組,通過遍歷取得
```
function getCookie(cookieName) { var cookies=document.cookie.split("; ");//一個分號加一個空格
if (!cookies.length) {return "";} var pair=["",""]; for (var i=0;i< cookies.length;i++) {
pair = cookies[i].split("=");//以賦值號分隔,第一位是Cookie名,第二位是Cookie值
if (pair[0]==cookieName) { break;
}
} return pair[1];
}
```
方案三:使用正則表達式解析
```
function getCookie(cookieName) { var re = new RegExp("\\b"+cookieName+"=([^;]*)\\b"); var arr = re.exec(document.cookie); return arr?arr[1]:"";
}
```
### 設置Cookie
一個Cookie包含以下信息:
* Cookie名稱,Cookie名稱必須使用只能用在URL中的字符,一般用字母及數字
* Cookie值,Cookie值同樣也只能使用可以用在URL中的字符,一般需要在設置Cookie值時對其使用encodeURI方法進行轉義
* Expires,過期日期,一個GMT格式的時間,當過了這個日期之后,瀏覽器就會將這個Cookie刪除掉,當不設置這個的時候,Cookie在瀏覽器關閉后消失
* Path,一個路徑,在這個路徑下面的頁面才可以訪問該Cookie,一般設為“/”,以表示同一個站點的所有頁面都可以訪問這個Cookie
* Domain,子域,指定在該子域下才可以訪問Cookie,例如要讓Cookie在bbs.x-life.com下可以訪問,但在news.x-life.com下不能訪問,則可將domain設置成bbs.x-life.com
* Secure,安全性,指定Cookie是否只能通過https協議訪問,一般的Cookie使用HTTP協議既可訪問,如果設置了Secure(沒有值),則只有當使用https協議連接時cookie才可以被頁面訪問
**注意:Cookie安全機制要求站點頁面只能訪問本站點的Cookie,不能訪問其它站點的Cookie。同時,最好在設置Cookie時使用encodeURI對象進行URI編碼,在取出Cookie時再使用decodeURI對其進行解碼!**
設置一個完整Cookie示例
```
var expires = new Date();
expires.setMonth(expires.getMonth()+1);//一個月后Cookie失效
document.cookie = "userName="+encodeURI("用戶名")+"; expires="+ expires.toGMTString()+"; path=/; domain=x-life.com; secure";
```
每次設置document.cookie值時如果該Cookie名稱并不存在,則新增一個Cookie,如果已經存在,則修改以前的值!
```
document.cookie ="a=1";//新增一個名稱為a的Cookie
document.cookie = "b=2";//新增一個名稱為b的Cookie,原來的Cookie安然無恙
document.cookie = "a=3";//將原來的名稱為a的Cookie值修改為3
```
setCookie函數
```
function setCookie(name,value,expires,domain,secure) { var str = name+"="+encodeURI(value);//不要忘了在對應getCookie函數里面加上decodeURI方法
if (expires) {
str += "; expires="+expires.toGMTString();
} if (path) {
str += "; path="+path;
} if (domain) {
str += "; domain="+domain;
} if (secure) {
str += "; secure";
}
document.cookie = str;
}
```
## 刪除Cookie
沒有刪除Cookie的直接的方法,但可以變通一下來刪除Cookie!
```
function delCookie(cookieName) { var expires = new Date();
expires.setTime(expires.getTime()-1);//將expires設為一個過去的日期,瀏覽器會自動刪除它
document.cookie = cookieName+"=; expires="+expires.toGMTString();
}
```
- 介紹
- HTML/CSS 教程
- 第 1 章 HTML5 概述
- 第 2 章 基本格式
- 第 3 章 文本元素
- 第 4 章 超鏈接和路徑
- 第 5 章 分組元素
- 第 6 章 表格元素
- 第 7 章 文檔元素
- 第 8 章 嵌入元素
- 第 9 章 音頻和視頻
- 第 10 章 表單元素[上]
- 第 10 章 表單元素[中]
- 第 10 章 表單元素[下]
- 第 11 章 全局屬性和其他
- 第 12 章 CSS 入門
- 第 13 章 CSS 選擇器[上]
- 第 14 章 CSS 顏色與度量單位
- 第 15 章 CSS 文本樣式[上]
- 第 15 章 CSS 文本樣式[下]
- 第 16 章 CSS 盒模型[上]
- 第 16 章 CSS 盒模型[下]
- 第 17 章 CSS 邊框與背景[上]
- 第 17 章 CSS 邊框與背景[下]
- 第 18 章 CSS 表格與列表
- 第 19 章 CSS 其他樣式
- 第 20 章 CSS3 前綴和 rem
- 第 21 章 CSS3 文本效果
- 第 21 章 CSS3 文本效果
- 第 23 章 CSS3 邊框圖片效果
- 第 24 章 CSS3 變形效果[下]
- 第 25 章 CSS3 過渡效果
- 第 26 章 CSS3 動畫效果
- 第 27 章 CSS 傳統布局[上]
- 第 27 章 CSS 傳統布局[下]
- 第 28 章 CSS3 多列布局
- 第 29 章 CSS3 彈性伸縮布局[上]
- 第 29 章 CSS3 彈性伸縮布局[中]
- 第 29 章 CSS3 彈性伸縮布局[下]
- 第 30 章 使用 Emmet 插件
- Bootstrap 教程
- 第 1 章 Bootstrap 介紹
- 第 2 章 排版樣式
- 第 3 章 表格和按鈕
- 第 4 章 表單和圖片
- 第 5 章 柵格系統
- 第 6 章 輔組類和響應式工具
- 第 7 章 圖標菜單按鈕組件
- 第 8 章 輸入框和導航組件
- 第 9 章 路徑分頁標簽和徽章組件
- 第 10 章 巨幕頁頭縮略圖和警告框組件
- 第 11 章 進度條媒體對象和 Well 組件
- 第 12 章 列表組面板和嵌入組件
- 第 13 章 模態框插件
- 第 14 章 下拉菜單和滾動監聽插件
- 第 15 章 標簽頁和工具提示插件
- 第 16 章 彈出框和警告框插件
- 第 17 章 按鈕和折疊插件
- 第 18 章 輪播插件
- 第 19 章 附加導航插件
- 第 20 章 項目實戰--響應式導航[1]
- 第 20 章 項目實戰--響應式輪播圖[2]
- 第 20 章 項目實戰--首頁內容介紹[上][3]
- 第 20 章 項目實戰--首頁內容介紹[下][4]
- 第 20 章 項目實戰--資訊內容[5,6]
- 第 20 章 項目實戰--案例和關于[7]
- javaScript 教程
- javascript快速入門1--JavaScript前世今生,HelloWorld與開發環境
- javascript快速入門2--變量,小學生數學與簡單的交互
- javascript快速入門3--分支判斷與循環
- javascript快速入門4--函數與內置對象
- javascript快速入門5--數組與對象
- javascript快速入門6--Script標簽與訪問HTML頁面
- javascript快速入門7--ECMAScript語法基礎
- javascript快速入門8--值,類型與類型轉換
- javascript快速入門9--引用類型
- javascript快速入門10--運算符,語句
- javascript快速入門11--正則表達式
- javascript快速入門12--函數式與面向對象
- javascript快速入門13--BOM——瀏覽器對象模型(Browser Object Model)
- javascript快速入門14--DOM基礎
- javascript快速入門15--節點
- javascript快速入門15--表單
- javascript快速入門16--表格
- javascript快速入門17--事件
- javascript快速入門18--樣式
- javascript快速入門19--定位
- javascript快速入門20--Cookie
- javascript快速入門21--DOM總結
- javascript快速入門22--Ajax簡介
- javascript快速入門23--XHR—XMLHttpRequest對象
- javascript快速入門24--XML基礎
- javascript快速入門25--瀏覽器中的XML
- javascript快速入門26--XPath
- javascript快速入門27--XSLT基礎
- PHP 教程
- 第一章 如何加載運行已發布的PHP項目
- 第二章 PHP基礎
- 第三章 操作符與控制結構
- 第四章 數學運算
- 第五章 數組
- 第六章 目錄與文件
- 第七章 自定義函數
- 第八章 字符串處理
- 第九章 正則表達式
- 第十章 日期與時間
- 第十一章 表單與驗證
- 第十二章 會話控制
- 第十三章 上傳文件
- 第十四章 處理圖像
- 第十五章 MySQL 數據庫
- 第十六章 PHP 操作MySQL
- 第十七章 面向對象基礎
- 第十八章 面向對象的特性
- 第十九章 面向對象的工具