吐血推薦cookie和session

吐血推薦cookie和session

很多人對於cookie和session一知半解,今天我們就全面透徹的分析一下cookie和session的原理和使用以及注意事項。

*寫在前面

我們的網頁訪問都是通過http協議實現,http是一個無狀態協議,說白了就是一個用戶請求一個頁面後,再請求同一網站上的另外一個頁面時,http協議並不認爲兩次請求是來自同一用戶,也就是http協議沒有一個內建機制來維護兩個事務之間的狀態。這種尷尬的局面應該如何逆轉,沒錯,cookie和session就是專爲此應用而生。

一、cookie

Cookie是用來將網站的資料信息記錄在客戶端(用戶電腦中)的一種技術。下面就舉個十分重要的例子,當我們訪問一個網頁時,通過服務器端認證後,服務器中的程序會把用戶信息設置到我們電腦的CooKie中,注意了,當我們再次訪問這個網站的其他腳本時,瀏覽器會自動攜帶Cookie中的數據一起訪問,在服務器端的每一個腳本都可以接受Cookie中的數據,不需要每訪問一個頁面就得重新驗證一次。 
接下來我們就開始從程序上詳細解讀Cookie。 
1、向客戶端電腦中設置Cookie 
setcookie(name,value,expire,path,domain,secure); 
比如我們向客戶端電腦中設置‘name’爲‘郭潤生’,‘email’爲‘[email protected]’,過期時間爲3600秒(1個小時)程序如下:

<?php 
header('Content-type:text/html;charset=utf-8');
setcookie('name','郭潤生',time()+3600);
setcookie('email','[email protected]',time()+3600);

運行本程序後,我們就成功地向客戶端電腦中設置了Cookie,而後當我們再次從同一沒關閉的瀏覽器中訪問該服務器上(網站)的腳本時,瀏覽器會自動攜帶該Coolie內容,所以我們再新建一個文件夾,然後直接讀取由瀏覽器傳過來的額Cookie值,這個Cookie值存到哪裏了呢?沒錯,超級全局變量$_COOKIE中,訪問Cookie值程序如下:

<?php
header('Content-type:text/html;charset=utf-8');
var_dump($_COOKIE);
?>

很顯然,我們順利地訪問到了Cookie中的值。 
2、有時候我們想把同一個人的信息存儲到一個變量中,即多維數組應用於cookie中,現在我們改寫上面的程序

程序如下:

<?php 
header('Content-type:text/html;charset=utf-8');
var_dump(setcookie('member[name]','郭潤生',time()+3600));
var_dump(setcookie('member[email]','[email protected]',time()+3600));
?>

3、銷燬Cookie 
有設置Cookie就有銷燬Cookie,銷燬Cookie語法如下: 
setcookie(“name”,”,time()-1);這裏將cookie的過期時間設置爲當前時間的前一秒,當然你可以設置爲前N秒。 
程序運行結果如下:

<?php 
foreach ($_COOKIE['member'] as $key=>$val){
    var_dump(setcookie("member[{$key}]",'',time()-3600));
}
?>

注意:使用setcookie刪除cookie的時候,需要與當初設置cookie的時候參數一致!(關於這個將在session中介紹)

二、session

Session技術與Cookie相似,都是用來存儲使用者的相關資料,但是他們最大的不同是Cookie是將資料信息存儲在客戶端的電腦中,而session則是將數據存放於服務器上。把保存的資料比喻爲健身房中的會員卡,Cookie技術相當於需要自己保存會員卡,會員卡中包含有自己所有的資料信息,每次去健身房時都需要持會員卡進健身房,而Session技術就相當於會員卡由健身房保存,每次來健身房的時候只需要報出會員卡卡號(我們暫稱之爲session_id,客戶端的cookie中只需要保存session_id)即可,由此看來,session的實現需要cookie支持,關於禁用cookie實現session的策略我們以後介紹,接下來我們詳細解讀session。 
1、開啓session 
session_start(); 
1)開啓一個會話(一個健身愛好者去健身房健身 辦會員卡) 
2)打開已經存在的會話(當客戶以後再到健身房健身的時候,根據上次辦理的卡號 驗證該顧客是會員。即根據客戶端傳遞過來的session_id把這個session_id對用的數據讀到$_SESSION超級全局變量中)。

2、使用session存儲數據 
向session中存數據,其語法就是想超級全局變量$_SESSION中壓入數據,比如我們需要將上面Cookie中的數據壓入到session中,語法如下

    <?php
    header('Content-type:text/html;charset=utf-8');
    session_start();
    $_SESSION['name']='郭潤生';
    $_SESSION['email']='[email protected]';

運行這個程序,我們幹了兩件事,第一爲用戶開啓一個session並把數據壓到session變量中,第二向客戶端cookie中傳遞了一個session_id值。然後我們可以驗證一下,是否有session和cookie,我們知道訪問同一網站的不同腳本都會攜帶該cookie,所以我們可以在另一個頁面中將該cookie打印出來,程序如下:

header('Content-type:text/html;charset=utf-8');
session_start();
var_dump($_SESSION);
var_dump($_COOKIE);
?>

經驗證,我們得到了session中和cookie中的數據。 
3、註銷變量與銷燬session

<?php 
session_start();//打開要銷燬的會話!
session_unset();//Free all session variables
session_destroy();//銷燬一個會話中的全部數據
setcookie(session_name(),'',time()-3600,'/');//銷燬保存在客戶端的卡號(session id)
?>

這裏解釋一下{注意:使用setcookie刪除cookie的時候,需要與當初設置cookie的時候參數一致!}我們在銷燬session時,到session_destroy()後就可以了,這裏我們就刪除掉了服務器端的session文件,這個文件可以通過php.ini配置,默認在tmp文件夾下,我們看到該文件夾下文件的命名,沒錯就是session_id,也就是cookie傳過來的值,或許前面有一個前綴sess_。接着說上面的,刪除這個文件後,即使用戶拿着session_id過來,我們也不認識它,cookie中的session_id在關閉瀏覽器後會自動銷燬。 
有關於session和cookie的配置文件php.ini大家可以瀏覽一下。 
注意:同一用戶,不同瀏覽器,服務器視爲不同用戶。

禁用Cookie後Session該如何傳遞

先提兩個思路,第一是通過隱藏表單傳遞,第二是通過http協議的頭部(URL重寫)。

<form name="testform" action="/xxx"> 
<input type="hidden" name="sessionid"
value="ka5g95v4ekh92503nd9abg6553″> 
</form>

URL重寫:

http://www.×××.com/test?sessionid=ka5g95v4ekh92503nd9abg6553 
具體詳細教程以後有時間附上!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章