Cookie 是在 HTTP 協定下,將伺服器傳遞給瀏覽器的少量資料儲存到使用者瀏覽器的一種方式。通過這種方式,即使在瀏覽器被關閉和連線中斷的情況下,使用者仍然可以維護這些資料。
Cookie 的使用很普遍,許多提供個性化服務的網站,都利用 Cookie 來辨認使用者,以便於送出給使用者量身定做的內容,比如網站的登陸、購物車等,有效地使用 Cookie 可以輕鬆完成很多複雜的任務。下面我們將對 Cookie 的相關知識進行詳細介紹。
什麼是 Cookie
Cookie 就是將瀏覽器瀏覽網頁的特定資訊以檔案的形式儲存在用戶端硬碟中。當再次存取該網站的時候,瀏覽器會首先嘗試讀取 Cookie 檔案,讀取到的資料供瀏覽器使用。常見的應用就是登陸一些類似空間、部落格類網頁,這些網頁通常每個人都有個性化的設定,通過 Cookie 技術就可以很快將它們展示出來。
Cookie 常用於以下三個方面:
-
記錄訪客的某些資訊。就像前面說的存取空間或者部落格;
-
在頁面之間傳遞資料。通常 Cookie 不會用來儲存密碼之類的資料,但是一個頁面的資料要在另一個頁面使用時,就需要通過 Cookie 技術來實現了;
-
將檢視的 Web 網頁儲存在 Cookie 臨時檔案中,可以加快網頁的存取速度。
一般不建議使用 Cookie 儲存資料集或其他較大的資料,同時並非所有的瀏覽器都支援 Cookie,並且資料資訊是以明文文字的形式儲存在用戶端計算機中的,因此最好不要儲存敏感的、未加密的資料,否則會影響網站的安全性。
建立 Cookie
在 PHP 中可以通過 setcookie() 函數建立 Cookie,不過在建立 Cookie 之前必須了解的是,Cookie 是 HTTP 響應頭的組成部分,而響應頭必須在頁而其他內容之前傳送,它必須最先輸出。若在 setcookie() 函數前輸出一個 HTML 標記或 echo 語句,甚至一個空行都會導致程式出錯。
setcookie() 函數的語法格式如下:
setcookie(string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]])
引數說明如下:
-
$name:設定 Cookie 的名稱;
-
$value:可選引數,用來設定 Cookie 的值。可以通過 $_COOKIE['$name'] 的形式來獲取 $value 的值;
-
$expire:可選引數,用來設定 Cookie 的過期時間,這個時間是 Unix 時間戳的形式。如果設定成零或者忽略該引數,Cookie 會在對談結束時過期(也就是關掉瀏覽器時);
-
$path:可選引數,用來設定 Cookie 有效的伺服器路徑。 設定成 '/' 時,Cookie 對整個域名 $domain 有效。 如果設定成'/foo/',則 Cookie 僅僅對 $domain 中 /foo/ 目錄及其子目錄有效(比如 /foo/bar/)。預設值為設定 Cookie 時的目錄;
-
$domain:可選引數,用來設定 Cookie 的有效域名/子域名。設定成子域名(例如 'c.biancheng.net'),會使 Cookie 對這個子域名和它的三級域名有效(例如 php.c.biancheng.net)。 要讓 Cookie 對整個域名有效(包括它的全部子域名),只要設定成域名就可以了(例如 'biancheng.net');
-
$secure:可選引數,用來設定這個 Cookie 是否僅僅通過安全的 HTTPS 連線傳給用戶端。設定成 TRUE 時,只有安全連線存在時才會設定 Cookie;
-
$httponly:可選引數,設定成 TRUE 時,Cookie 僅可通過 HTTP 協定存取,也就是說 Cookie 無法通過類似 JavaScript 這樣的指令碼語言存取。設定該引數可以有效的減少受到 XSS 攻擊的風險。
注意:如果在呼叫 setcookie() 函數以前產生了輸出,setcookie() 會呼叫失敗並返回 FALSE。 如果 setcookie() 成功執行,則會返回 TRUE。
【範例】使用 setcookie() 函數建立 Cookie。
<?php
setcookie('Website', 'C語言中文網');
setcookie('Title', 'Cookie', time()+3600); // 設定 Cookie 1 小時後過期
setcookie('Url', 'http://c.biancheng.net/php/', time()+3600, '/', 'c.biancheng.net', false);
echo '<pre>';
print_r($_COOKIE);
?>
執行結果如下:
Array
(
[Website] => C語言中文網
[Title] => Cookie
[Url] => http://c.biancheng.net/php/
)
提示:當第一次執行這個指令碼檔案時並不會有任何輸出資訊,因此設定完 Cookie 後需要重新整理一下頁面,這樣在下次請求時 HTTP 頭部才會攜帶上一次設定的 Cookie 資訊,這時才能讀取到 Cookie。
讀取 Cookie
在 PHP 中可以使用超全域性變數 $_COOKIE 來讀取瀏覽器的 Cookie 值。$_COOKIE 是一個儲存著所有 Cookie 資訊的陣列,可以通過 $_COOKIE['Cookie 名稱'] 的形式來獲取具體 Cookie 的值。
【範例】使用超全域性變數 $_COOKIE 獲取 Cookie 的值。
<?php
echo 'Website 的值為:'.$_COOKIE['Website'].'<br>';
echo 'Url 的值為:'.$_COOKIE['Url'].'<br>';
echo 'Title 的值為:'.$_COOKIE['Title'];
?>
執行結果如下:
Website 的值為:C語言中文網
Url 的值為:http://c.biancheng.net/php/
Title 的值為:Cookie
刪除 Cookie
當 Cookie 被建立後,如果沒有設定它的失效時間,其 Cookie 檔案會在關閉瀏覽器時被自動刪除,如果要在關閉瀏覽器之前刪除 Cookie 檔案,同樣需要使用 setcookie() 函數。
刪除 Cookie 和建立 Cookie 的方式基本類似,只需要使用 setcookie() 函數將 Cookie 的值(也就是第二個引數)設定為空,或者將 Cookie 的過期時間(也就是第三個引數)設定為小於系統的當前時間即可。
【範例】刪除指定 Cookie 的值。
<?php
setcookie('Website','');
setcookie('Title','Cookie',time()-1);
echo '<pre>';
print_r($_COOKIE);
?>
執行結果如下:
Array
(
[Url] => http://c.biancheng.net/php/
)