本專題通過圖文、視頻的形式全面介紹了php cookie的由來,php cookie屬性有哪些,php cookie函數(shù)用法以及php cookie實際應(yīng)用實例,通俗易懂!歡迎php中文網(wǎng)的同學們學習!
一:什么是 Cookie ?
cookie 常用于識別用戶。
cookie 是一種服務(wù)器留在用戶計算機上的小文件。
每當同一臺計算機通過瀏覽器請求頁面時,這臺計算機將會發(fā)送 cookie。
通過 PHP,您能夠創(chuàng)建并取回 cookie 的值。
相關(guān)專題推薦:php session
二:Cookie 的誕生
由于HTTP協(xié)議是無狀態(tài)的,而服務(wù)器端的業(yè)務(wù)必須是要有狀態(tài)的。
Cookie誕生的最初目的是為了存儲web中的狀態(tài)信息,以方便服務(wù)器端使用。
比如判斷用戶是否是第一次訪問網(wǎng)站。目前最新的規(guī)范是RFC 6265,它是一個由瀏覽器服務(wù)器共同協(xié)作實現(xiàn)的規(guī)范。
三:Cookie 的原理
第一次訪問網(wǎng)站的時候,瀏覽器發(fā)出請求,服務(wù)器響應(yīng)請求后,會將cookie放入到響應(yīng)請求中,在瀏覽器第二次發(fā)請求的時候,會把cookie帶過去,服務(wù)端會辨別用戶身份,當然服務(wù)器也可以修改cookie內(nèi)容。
四:Cookie 屬性
Cookie是一段不超過4KB的小型文本數(shù)據(jù),由一個名稱(Name)、一個值(Value)和其它幾個用于控制Cookie有效期、安全性、使用范圍的可選屬性組成。
Name | 表示 Cookie 的名稱。 |
Value |
表示 Cookie 的值。 |
Domain |
指定了可以訪問該 Cookie 的 Web 站點或域。 Cookie 機制并未遵循嚴格的同源策略,允許一個子域可以設(shè)置或獲取其父域的 Cookie。 |
Path |
定義了Web站點上可以訪問該Cookie的目錄。 |
Expires |
什么是有效期,就是圖中的Expires屬性,一般瀏覽器的cookie都是默認儲存的,當關(guān)閉瀏覽器結(jié)束這個會話的時候,這個cookie也就會被刪除。 |
Secure |
指定是否使用HTTPS安全協(xié)議發(fā)送Cookie。 使用HTTPS安全協(xié)議,可以保護Cookie在瀏覽器和Web服務(wù)器間的傳輸過程中不被竊取和篡改。該方法也可用于Web站點的身份鑒別,即在HTTPS的連接建立階段,瀏覽器會檢查Web網(wǎng)站的SSL證書的有效性。 |
HttpOnly | 用于防止客戶端腳本通過document.cookie屬性訪問Cookie,有助于保護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,會和剩下的 HTTP 頭一起發(fā)送給客戶端。
和其他 HTTP 頭一樣,必須在腳本產(chǎn)生任意輸出之前發(fā)送 Cookie(由于協(xié)議的限制)。
請在產(chǎn)生任何輸出之前(包括 <html> 和 <head> 或者空格)調(diào)用本函數(shù)。
一旦設(shè)置 Cookie 后,下次打開頁面時可以使用 $_COOKIE 讀取。
Cookie 值同樣也存在于 $_REQUEST。
參數(shù)
參數(shù) | 描述 |
name | Cookie 名稱。 |
value |
Cookie 值。 這個值儲存于用戶的電腦里,請勿儲存敏感信息。 |
expire |
Cookie 的過期時間。 這是個 Unix 時間戳,即 Unix 紀元以來的秒數(shù)。 也就是說,基本可以用 time() 函數(shù)的結(jié)果加上希望過期的秒數(shù)。 |
path |
Cookie 有效的服務(wù)器路徑。 設(shè)置成 '/' 時,Cookie 對整個域名 domain 有效。 如果設(shè)置成 '/foo/', Cookie 僅僅對 domain 中 /foo/ 目錄及其子目錄有效。 默認值是設(shè)置 Cookie 時的當前目錄。 |
domain |
Cookie 的有效域名/子域名。 設(shè)置成子域名,會使 Cookie 對這個子域名和它的三級域名有效。 要讓 Cookie 對整個域名有效,只要設(shè)置成域名就可以了。 |
secure |
設(shè)置這個 Cookie 是否僅僅通過安全的 HTTPS 連接傳給客戶端。 設(shè)置成 TRUE 時,只有安全連接存在時才會設(shè)置 Cookie。 如果是在服務(wù)器端處理這個需求,程序員需要僅僅在安全連接上發(fā)送此類 Cookie 。 |
httponly |
設(shè)置成 TRUE,Cookie 僅可通過 HTTP 協(xié)議訪問。 這意思就是 Cookie 無法通過類似 JavaScript 這樣的腳本語言訪問。 要有效減少 XSS 攻擊時的身份竊取行為,可建議用此設(shè)置,不過這個說法經(jīng)常有爭議。 |
返回值
如果在調(diào)用本函數(shù)以前就產(chǎn)生了輸出,setcookie() 會調(diào)用失敗并返回 FALSE。
如果 setcookie() 成功運行,返回 TRUE。
示例
<?php $value = 'something from somewhere'; setcookie("TestCookie", $value); setcookie("TestCookie", $value, time()+3600); /* 1 小時過期 */ 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 值沒有自動經(jīng)過 URL 編碼(urlencode)。
六:PHP Cookie 簡單示例
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、面向過程封裝
<?php /** * 獲取 Cookie * @param string $name Cookie 名稱 * @return mixed Cookie 值 */ function cookie_get($name) { return isset($_COOKIE[$name]) ? $_COOKIE[$name] : null; } /** * 刪除 Cookie * @param string $name Cookie 名稱 */ function cookie_del($name) { setcookie($name, '', time() - 3600); } /** * 設(shè)置Cookie * @param string $name Cookie 名稱 * @param mixed $value Cookie 值 * @param integer $expire Cookie 過期時間 * @param string $path Cookie 有效路徑 * @param string $domian Cookie 有效域名/子域名 */ function cookie_set($name, $value, $expire = 3600, $path = '/', $domian = '') { setcookie($name, $value, time() + $expire); } /** * 檢測 Cookie * @param string $name Cookie 名稱 * @param boolean $has_empty 檢測為空 * @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 實例 * @var null */ private static $instance = null; /** * Cookie 選項 * @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() { } /** * 獲取實例 * @param $options * @return Cookie|null */ public static function getInstance($options) { if (is_null(self::$instance)) { self::$instance = new self($options); } return self::$instance; } /** * 設(shè)置選項 * @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è)置多個選項 * @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、記住登錄賬號示例
<?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>用 戶 名</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>記住賬號</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面試題及答案(最新)
- 下一篇:沒有了