本專(zhuān)題通過(guò)圖文、視頻的形式全面介紹了php cookie的由來(lái),php cookie屬性有哪些,php cookie函數(shù)用法以及php cookie實(shí)際應(yīng)用實(shí)例,通俗易懂!歡迎php中文網(wǎng)的同學(xué)們學(xué)習(xí)!
一:什么是 Cookie ?
cookie 常用于識(shí)別用戶(hù)。
cookie 是一種服務(wù)器留在用戶(hù)計(jì)算機(jī)上的小文件。
每當(dāng)同一臺(tái)計(jì)算機(jī)通過(guò)瀏覽器請(qǐng)求頁(yè)面時(shí),這臺(tái)計(jì)算機(jī)將會(huì)發(fā)送 cookie。
通過(guò) PHP,您能夠創(chuàng)建并取回 cookie 的值。
相關(guān)專(zhuān)題推薦:php session
二:Cookie 的誕生
由于HTTP協(xié)議是無(wú)狀態(tài)的,而服務(wù)器端的業(yè)務(wù)必須是要有狀態(tài)的。
Cookie誕生的最初目的是為了存儲(chǔ)web中的狀態(tài)信息,以方便服務(wù)器端使用。
比如判斷用戶(hù)是否是第一次訪問(wèn)網(wǎng)站。目前最新的規(guī)范是RFC 6265,它是一個(gè)由瀏覽器服務(wù)器共同協(xié)作實(shí)現(xiàn)的規(guī)范。
三:Cookie 的原理
第一次訪問(wèn)網(wǎng)站的時(shí)候,瀏覽器發(fā)出請(qǐng)求,服務(wù)器響應(yīng)請(qǐng)求后,會(huì)將cookie放入到響應(yīng)請(qǐng)求中,在瀏覽器第二次發(fā)請(qǐng)求的時(shí)候,會(huì)把cookie帶過(guò)去,服務(wù)端會(huì)辨別用戶(hù)身份,當(dāng)然服務(wù)器也可以修改cookie內(nèi)容。
四:Cookie 屬性
Cookie是一段不超過(guò)4KB的小型文本數(shù)據(jù),由一個(gè)名稱(chēng)(Name)、一個(gè)值(Value)和其它幾個(gè)用于控制Cookie有效期、安全性、使用范圍的可選屬性組成。
Name | 表示 Cookie 的名稱(chēng)。 |
Value |
表示 Cookie 的值。 |
Domain |
指定了可以訪問(wèn)該 Cookie 的 Web 站點(diǎn)或域。 Cookie 機(jī)制并未遵循嚴(yán)格的同源策略,允許一個(gè)子域可以設(shè)置或獲取其父域的 Cookie。 |
Path |
定義了Web站點(diǎn)上可以訪問(wèn)該Cookie的目錄。 |
Expires |
什么是有效期,就是圖中的Expires屬性,一般瀏覽器的cookie都是默認(rèn)儲(chǔ)存的,當(dāng)關(guān)閉瀏覽器結(jié)束這個(gè)會(huì)話(huà)的時(shí)候,這個(gè)cookie也就會(huì)被刪除。 |
Secure |
指定是否使用HTTPS安全協(xié)議發(fā)送Cookie。 使用HTTPS安全協(xié)議,可以保護(hù)Cookie在瀏覽器和Web服務(wù)器間的傳輸過(guò)程中不被竊取和篡改。該方法也可用于Web站點(diǎn)的身份鑒別,即在HTTPS的連接建立階段,瀏覽器會(huì)檢查Web網(wǎng)站的SSL證書(shū)的有效性。 |
HttpOnly | 用于防止客戶(hù)端腳本通過(guò)document.cookie屬性訪問(wèn)Cookie,有助于保護(hù)Cookie不被跨站腳本攻擊竊取或篡改。 |
五:PHP Cookie 函數(shù)
1、setcookie — 發(fā)送 Cookie
setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] ) : bool
setcookie() 定義了 Cookie,會(huì)和剩下的 HTTP 頭一起發(fā)送給客戶(hù)端。
和其他 HTTP 頭一樣,必須在腳本產(chǎn)生任意輸出之前發(fā)送 Cookie(由于協(xié)議的限制)。
請(qǐng)?jiān)诋a(chǎn)生任何輸出之前(包括 <html> 和 <head> 或者空格)調(diào)用本函數(shù)。
一旦設(shè)置 Cookie 后,下次打開(kāi)頁(yè)面時(shí)可以使用 $_COOKIE 讀取。
Cookie 值同樣也存在于 $_REQUEST。
參數(shù)
參數(shù) | 描述 |
name | Cookie 名稱(chēng)。 |
value |
Cookie 值。 這個(gè)值儲(chǔ)存于用戶(hù)的電腦里,請(qǐng)勿儲(chǔ)存敏感信息。 |
expire |
Cookie 的過(guò)期時(shí)間。 這是個(gè) Unix 時(shí)間戳,即 Unix 紀(jì)元以來(lái)的秒數(shù)。 也就是說(shuō),基本可以用 time() 函數(shù)的結(jié)果加上希望過(guò)期的秒數(shù)。 |
path |
Cookie 有效的服務(wù)器路徑。 設(shè)置成 '/' 時(shí),Cookie 對(duì)整個(gè)域名 domain 有效。 如果設(shè)置成 '/foo/', Cookie 僅僅對(duì) domain 中 /foo/ 目錄及其子目錄有效。 默認(rèn)值是設(shè)置 Cookie 時(shí)的當(dāng)前目錄。 |
domain |
Cookie 的有效域名/子域名。 設(shè)置成子域名,會(huì)使 Cookie 對(duì)這個(gè)子域名和它的三級(jí)域名有效。 要讓 Cookie 對(duì)整個(gè)域名有效,只要設(shè)置成域名就可以了。 |
secure |
設(shè)置這個(gè) Cookie 是否僅僅通過(guò)安全的 HTTPS 連接傳給客戶(hù)端。 設(shè)置成 TRUE 時(shí),只有安全連接存在時(shí)才會(huì)設(shè)置 Cookie。 如果是在服務(wù)器端處理這個(gè)需求,程序員需要僅僅在安全連接上發(fā)送此類(lèi) Cookie 。 |
httponly |
設(shè)置成 TRUE,Cookie 僅可通過(guò) HTTP 協(xié)議訪問(wèn)。 這意思就是 Cookie 無(wú)法通過(guò)類(lèi)似 JavaScript 這樣的腳本語(yǔ)言訪問(wèn)。 要有效減少 XSS 攻擊時(shí)的身份竊取行為,可建議用此設(shè)置,不過(guò)這個(gè)說(shuō)法經(jīng)常有爭(zhēng)議。 |
返回值
如果在調(diào)用本函數(shù)以前就產(chǎn)生了輸出,setcookie() 會(huì)調(diào)用失敗并返回 FALSE。
如果 setcookie() 成功運(yùn)行,返回 TRUE。
示例
<?php $value = 'something from somewhere'; setcookie("TestCookie", $value); setcookie("TestCookie", $value, time()+3600); /* 1 小時(shí)過(guò)期 */ setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", 1); ?>
2、setrawcookie — 發(fā)送未經(jīng) URL 編碼的 cookie
setrawcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] ) : bool
setrawcookie() 和 setcookie() 非常相似,唯一不同之處是發(fā)送到瀏覽器的 cookie 值沒(méi)有自動(dòng)經(jīng)過(guò) URL 編碼(urlencode)。
六:PHP Cookie 簡(jiǎn)單示例
1、基本操作
<?php //添加Cookie setcookie('username', 'phpcn', time() + 3600); //獲取Cookie $username = $_COOKIE['username']; //刪除Cookie setcookie('username', '', time() - 3600); //修改Cookie setcookie('username', 'phpcn-updated', time() + 3600); ?>
2、面向過(guò)程封裝
<?php /** * 獲取 Cookie * @param string $name Cookie 名稱(chēng) * @return mixed Cookie 值 */ function cookie_get($name) { return isset($_COOKIE[$name]) ? $_COOKIE[$name] : null; } /** * 刪除 Cookie * @param string $name Cookie 名稱(chēng) */ function cookie_del($name) { setcookie($name, '', time() - 3600); } /** * 設(shè)置Cookie * @param string $name Cookie 名稱(chēng) * @param mixed $value Cookie 值 * @param integer $expire Cookie 過(guò)期時(shí)間 * @param string $path Cookie 有效路徑 * @param string $domian Cookie 有效域名/子域名 */ function cookie_set($name, $value, $expire = 3600, $path = '/', $domian = '') { setcookie($name, $value, time() + $expire); } /** * 檢測(cè) Cookie * @param string $name Cookie 名稱(chēng) * @param boolean $has_empty 檢測(cè)為空 * @return boolean */ function cookie_has($name) { return isset($_COOKIE[$name]); } ?>
3、面向?qū)ο蠓庋b
<?php class Cookie { const OPTION_EXPIRE = 'expire'; const OPTION_PATH = 'path'; const OPTION_DOMAIN = 'domain'; const OPTION_SECURE = 'secure'; const OPTION_HTTPONLY = 'httponly'; /** * Cookie 實(shí)例 * @var null */ private static $instance = null; /** * Cookie 選項(xiàng) * @var array */ private $options = [ self::OPTION_EXPIRE => 3600, self::OPTION_PATH => '/', self::OPTION_DOMAIN => 'domain', self::OPTION_SECURE => false, self::OPTION_HTTPONLY => false ]; /** * Cookie constructor. * @param $options */ private function __construct($options) { $this->setOptions($options); } /** * privated __clone */ private function __clone() { } /** * 獲取實(shí)例 * @param $options * @return Cookie|null */ public static function getInstance($options) { if (is_null(self::$instance)) { self::$instance = new self($options); } return self::$instance; } /** * 設(shè)置選項(xiàng) * @param $name * @param $value */ public function setOption($name, $value) { if (isset($this->options[$name])) { $this->options[$name] = $value; } throw new InvalidArgumentException('Cookie option not exists:{$name}'); } /** * 設(shè)置多個(gè)選項(xiàng) * @param $options */ public function setOptions($options) { foreach ($options as $name => $value) { $this->setOption($name, $value); } } /** * 設(shè)置 Cookie * @param $name * @param $value * @param array $options */ public function set($name, $value, $options = []) { $this->setOptions($options); if (is_array($value) || is_object($value)) { $value = json_encode($value); } setcookie( $name, $value, $this->options[self::OPTION_EXPIRE], $this->options[self::OPTION_PATH], $this->options[self::OPTION_DOMAIN], $this->options[self::OPTION_SECURE], $this->options[self::OPTION_HTTPONLY] ); } /** * 獲取 Cookie * @param $name * @return array|mixed */ public function get($name) { $value = $_COOKIE[$name]; if (is_array($value)) { $arr=[]; foreach ($value as $k => $v) { $arr[$k] = substr($v, 0,1) == '{' ? json_decode($value) : $v; } return $arr; } else { return substr($value, 0,1) == '{' ? json_decode($value) : $value; } } /** * 刪除 Cookie * @param $name * @param array $options */ public function del($name, $options = []) { $this->setOptions($options); $value = $_COOKIE[$name]; if ($value) { if (is_array($value)) { foreach ($value as $k => $v) { setcookie( $name . '[' . $k . ']', '', time() - 3600, $this->options[self::OPTION_EXPIRE], $this->options[self::OPTION_PATH], $this->options[self::OPTION_DOMAIN], $this->options[self::OPTION_SECURE], $this->options[self::OPTION_HTTPONLY] ); unset($v); } }else{ setcookie( $name, '', time() - 3600, $this->options[self::OPTION_EXPIRE], $this->options[self::OPTION_PATH], $this->options[self::OPTION_DOMAIN], $this->options[self::OPTION_SECURE], $this->options[self::OPTION_HTTPONLY] ); unset($value); } } } }
4、記住登錄賬號(hào)示例
<?php function cookie_get_username() { return isset($_COOKIE['username']) ? $_COOKIE['username'] : null; } function cookie_get_password() { return isset($_COOKIE['username']) ? $_COOKIE['username'] : null; } function cookie_get_remember() { return isset($_COOKIE['remember']) ? 'checked' : null; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = $_POST['username']; $password = $_POST['password']; if (isset($_POST['remember']) && $_POST['remember'] === '1') { setcookie('username', $username, time() + 3600); setcookie('password', $password, time() + 3600); setcookie('remember', '1', time() + 3600); } else { setcookie('username', '', time() - 3600); setcookie('password', '', time() - 3600); setcookie('remember', '', time() - 3600); } die('登錄成功!'); } ?> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <form action="" method="post"> <table width="300" border="1" align="center" cellpadding="5" cellspacing="5"> <thead> <tr> <td colspan="2" align="center"><b>登錄</b></td> </tr> </thead> <tr align="center"> <td>用 戶(hù) 名</td> <td><input type="text" name="username" value="<?=cookie_get_username()?>"></td> </tr> <tr align="center"> <td>密碼</td> <td><input type="password" name="password" value="<?=cookie_get_password()?>"></td> </tr> <tr align="center"> <td>記住賬號(hào)</td> <td> <input type="checkbox" name="remember" value="1" <?=cookie_get_remember()?>> </td> </tr> <tr align="center"> <td colspan="2"><input type="submit" name="Submit" value="提交" /></td> </tr> </table> </form>
六:php cookie 精選技術(shù)文章
待添加
七:php cookie 相關(guān)視頻教程
待添加
- 上一篇:2020年ajax面試題及答案(最新)
- 下一篇:沒(méi)有了