Cookie和Session简介与区别
1、Cookie和Session簡介與區別
在非常多時候,我們需要跟蹤瀏覽者在整個網站的活動,對他們身份進行自動或半自動的識別(也就是平時常說的網站登陸之類的功能),這時候,我們常采用Cookie與 Session來跟蹤和判斷。
區別
Session信息是存放在server端,但session id是存放在client cookie的,當然php的session存放方法是多樣化的,這樣就算禁用cookie一樣可以跟蹤
Cookie是完全保持在客戶端的如:IE firefox 當客戶端禁止cookie時將不能再使用
2、Cookie的配置與應用
Setcookie(string name, string value, int expire,string path, string domain, int secure);?
????? 其中name是cookie變量名稱標識,你在php中將能象使用普通變量名相同來用他引用cookie變量。value是cookie變量的初始值,expire 表示該cookie變量的有效時間;path 為該cookie變量的相關路徑;domain 表示cookie變量的網站;secure 則需在 https 的安全傳輸時才有效。
SetCookie("Cookie", "cookievalue",time()+3600, "/forum", ".php100.com", 1);?
接收和處理Cookie
PHP對Cookie的接收和處理的支持非常好,是完全自動的,跟FORM變量的原則一樣,特別簡單。
比如設置一個名為 MyCookier的Cookie,PHP會自動從WEB服務器接收的HTTP頭里把它分析出來,并形成一個與普通變量一樣的變量,名為$ myCookie,這個變量的值就是Cookie的值。數組同樣適用。另外一個辦法是引用PHP的全局變量$HTTP_COOKIE_VARS數組。
分別舉例如下:(假設這些都在以前的頁面里設置過了,并且仍然有效)
?
刪除Cookie
要刪除一個已經存在的Cookie,有兩個辦法:
1、SetCookie("Cookie", "");
2、SetCookie("Cookie", "value" , time()-1 / time() );
使用Cookie的限制
1、必須在HTML文件的內容輸出之前設置;
2、不同的瀏覽器對Cookie的處理不一致,且有時會出現錯誤的結果。
3、限制是在客戶端的。一個瀏覽器能創建的Cookie數量最多為30個,并且每個不能超過4KB,每個WEB站點能設置的Cookie總數不能超過20個。
3、Session的配置與應用
?
注意:session_register(),session_unregister,session_is_registered在php5下不再使用
//cookies用法實例
if($_GET['out']) { //用于注銷cookiessetcookie('id',"");setcookie('pass',"");echo "<script>location.href='login.php'</script>"; //因為cookies不是及時生效的,只有你再次刷新時才生效,所以,注銷后讓頁面自動刷新。 }if($_POST['name']&&$_POST['password']) //如果變量用戶名和密碼存在時,在下面設置cookies { //用于設置cookiessetcookie('id',$_POST['name'],time()+3600);setcookie('pass',$_POST['password'],time()+3600);echo "<script>location.href='login.php'</script>"; //讓cookies及時生效 } if($_COOKIE['id']&&$_COOKIE['pass']) { //cookies設置成功后,用于顯示cookiesecho "登錄成功!<br />用戶名:".$_COOKIE['id']."<br/>密碼:".$_COOKIE['pass'];echo "<br />";echo "<a href='login.php?out=out'>注銷cookies</a>"; //雙引號內,如果再有引號,需要用單引號。 }?> <form action="" method="post"> 用戶ID: <input type="text" name="name" /><br/><br/> 密碼: <input type="password" name="password" /><br/><br /> <input type="submit" name="submit"> </form>?
//session用法實例
<?php //session用法實例 session_start();//啟動session,必須放在第一句,否則會出錯。 if($_GET['out']) {unset($_SESSION['id']);unset($_SESSION['pass']); }if($_POST['name']&&$_POST['password']) { //用于設置session$_SESSION['id']=$_POST['name'];$_SESSION['pass']=$_POST['password']; }if($_SESSION['id']&&$_SESSION['pass']) {echo "登錄成功!<br/>用戶ID:".$_SESSION['id']."<br />用戶密碼:".$_SESSION['pass'];echo "<br />";echo "<a href='login.php?out=out'>注銷session</a>"; }?> <form action="login.php" method="post"> 用戶ID: <input type="text" name="name" /><br/><br/> 密碼: <input type="password" name="password" /><br/><br /> <input type="submit" name="submit"> </form>?
?
?
另一篇
在一個頁面設置一個cookie時,必須刷新或到下一個頁面才可以用 $_COOKIE 得到變量的值.
原因是因為當頁面第一次被瀏覽器訪問載入時,頁面中的 cookie 會被設置,將其發送存儲到客戶端指定的存儲位置,所以$_COOKIE沒有接收到客戶端發送過來的 cookie 變量的值,當刷新或到下一個頁面時,客戶端會在頁面程序在服務器端運行之前,發送與該地址相對應的 cookie到服務器端,所以 $_COOKIE 可以得到的值! 說白了就是當每一個頁面被訪問時,如果客戶端找到了與訪問地址相對應的 cookie 時,會在程序在服務器端運行之前發送這個 cookie 到服務器端. (個人對此的看法)
本人表達能力不強,如有不明,還請抱歉!
php中設置cookie數組的時候,不可以用像php中的那個添加數據的方法:
<?php setcookie('my_cookie[]', 1); setcookie('my_cookie[]', 2); print_r($_COOKIE); // Array ( [my_cookie] => Array ( [0] => 1 )) // 數組的值添加是添加成功了,不過索引沒有變,后面的數據將前的數據覆蓋了! 由此得到my_cookie[],默認指向數據的第一元素的位置,即索引為 0 的位置. 注意與php中的不一樣! 以后用cookie數據記住要指定數組元素索引哦!$my_cookie[] = 1; $my_cookie[] = 2; print_r($my_cookie); //Array ( [0] => 1 [1] => 2) ?>?
刪除 cookie 變量的兩個方法:
?
會話id默認儲放在客戶端Cookie中!
<?php session_start(); print_r($_COOKIE); ?>?
cookie的設置有兩種方法
header('set-cookie:user=zhaofei299');
setcookie('user', 'zhaofei299');
會話變量不能被GET數據或POST數據重載!
使用session變量傳遞數組,對象時無需序列化!
使用session變量傳遞對象時,在調用session_start()之前,必須包含該對類對象的定義,反序列化
(serialize)也是如此!
刪除單個會話變量可以使用unset($_SESSION['***']) 直接刪除!
刪除所有的會話變量不可以用unset($_SESSION),因為這樣會將所有的會話信息刪除,包含存儲在COOKIE
中的PHPSESSID,也就是破壞了兩個頁面之間的會話聯系,應該使用$_SESSION = array();
消除會話id,使頁面之間失去聯系!
session_destroy();
程序清單1.1
?
會話id(session_id)的兩種方式傳遞:
1.cookie
2.url
因為默認session是基于cookie的,而cookie又是跟隨http協議發送的,所以與cookie一樣,在
session_start()之前不能有任何輸出!
現在主要說一說第二種,通過 url 傳遞會話id
php中已經定義SID這個常量來得到 會話的id
sesssin_id 的使用!
?
為什么SID的值會是null 呢?是它哪里有問題了?
原因是因為 session 默認是基于 cookie 的,而 SID 只有 session_id 通過 url
傳遞數據時才會被賦值!
在瀏覽器中將 cookie 禁用,你就會發現 SID 有了輸出,而不是 null!
刪除session
要三步實現.
?
大家都知道session變量是保存在服務器端的,也就是說session的變量會保存在服務器中一個目錄中,我
們可以在php.ini中的session.save_path 那里可以找到session文件中保存的地址.
默認的session的生存期是瀏覽的關閉就結束,但要知道會話過期結束后,當打開頁面session_start()會
判斷會話id 是否存在,如果不存在就創建一個,否則將該會話id 的變量載入頁面!因為過期session_id會
被創建一個新的,但它保存在服務器端的session文件并沒有被刪除(關閉瀏覽器,打開session文件保存
地看看),所以要用session_destory()函數清除會話id,并同時清除相應的會話文件,這樣的話才能做到最
徹底的清除!
session_id 使用 url 傳遞session 變量數據時,因為session_start()開啟會話時會判斷會話id 是否存
在,如果不存在就創建一個,否則將該會話id 的變量載入頁面!
而現在是使用url 來傳遞session_id,然而每一次 刷新/進入頁面 都會生成一個會話id,所以頁面之間就
不能得到在另一頁面設置過的session_id 的變量,那么使用 session也就沒什么意義了!
解決方法:在session_start()之前,手動設置頁面的session_id,這樣頁面的就可以得到前一頁中所設置的
session變量的,也就實現了會話的傳遞,如下代碼可以說明!
//已禁用 cookie
1.php
?
1.php的第4行代碼也可以寫成:echo '<a href="2.php">下一頁</a>';
可以設置php.ini 中的 session.use_trans_sid 為1,這樣當使用 url 傳遞會話 id 時,
瀏覽器會自動將 session_id 追加到 url 的后面!
就好像 在瀏覽器中 輸入: www.baidu.com 一樣,瀏覽器會自動將其更換成 http://www.baidu.com/
2.php
?
常用session函數:
bool session_start(void); 初始化session bool session_destroy(void): 刪除服務器端session關聯文件。 string session_id() 當前session的id string session_name() 當前存取的session名稱,也就是客戶端保存session ID的cookie名稱.默認 PHPSESSID。 array session_get_cookie_params() 與這個session相關聯的session的細節. string session_cache_limiter() 控制使用session的頁面的客戶端緩存 ini session_cache_expire() 控制客戶端緩存時間 bool session_destroy() 刪除服務器端保存session信息的文件 void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )設置與這個session相關聯的session的細節 bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定義處理session的函數,(不是使用默認的方式) bool session_regenerate_id([bool delete_old_session]) 分配新的session id?
轉載于:https://www.cnblogs.com/zyh-club/p/4993318.html
總結
以上是生活随笔為你收集整理的Cookie和Session简介与区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Cogs14] [网络流24题#1]
- 下一篇: 又发现一个visual studio 2