解惑cookie和session

cookie:

cookie分爲二種
1,以文件方式存在硬盤空間上的長期性的cookie
2,停留在瀏覽器所佔內存中的臨時性的cookie
瀏覽網站時,你會經常發現網站登錄的地方,會有提示,問你是不是要記住自己的登錄狀態,像這種情況,登錄時填寫的一些信息會被以文件的方式存放在客戶端的硬盤上,這種是屬於第一種cookie;平時如果你沒勾選記住密碼,則退出瀏覽器的時候cookie就會自動清除,下次訪問網站則需要重新登陸,這種cookie是第二種。
cookie是保存在客戶端的,它是服務器在本地機器上存儲的小段文本或者是內存中的一段數據,並隨每一個請求發送至同一個服務器。服務器是通過http裏的Set-Cookie來創建cookie的,在客戶終端,瀏覽器解析這些cookies並將它們保存爲一個本地文件,或者本地內存中數據。因爲cookie是存在客戶端的,很容易被用戶讀取,雖然cookie裏的信息可以加密,但是也很容易被惡意利用。.

session:
session跟cookie有點類似,都是用來記錄用戶信息的,但是它是存儲在服務器端的。
以php爲例,sesion使用的一個簡單流程:
當服務器需要給某個客戶端創建一個session的時候,(php使用session_start()函數來創建一個session)先檢查是否已經存在該客戶端的session,檢查的方式就是通過session標識(sessionid),服務器會檢查這個標識來檢查服務器上是否有對應的session。如果沒有,則創建一個。
創建完了會在客戶端爲該網站設置保存的cookie中添加一個值,這個值就是sessionid。當瀏覽器下次訪問服務器的時候,服務器檢查這個值,如果能在服務器中找得到這個標識(sessionid),就能使用對應的session。

這裏涉及到一個知識,sessionname,也就是session的名稱。php對cookie操作是將其轉換成一個數組,服務器向客戶端的cookie插入session標識時,是插入一條key值爲sessionname的數據(元素):$_COOKIE[sessionname],value是sessionid。當服務器讀取cookie時,看到key爲sessionname就知道這條數據存的就是session標識(sessionid),再通過這個標識去找到相應的session。sessionname是固定的一個常量,可以到php.ini文件裏去設置,默認爲PHPSESSID。。當服務器獲取客戶端的session標識時,直接讀取$_COOKIE[sessionname]的值就是了。

這裏可以用這兩句代碼證明:
echo $_COOKIE['PHPSESSID'].’=’.session_id();
echo $_COOKIE[session_name()].’=’.session_id();

php中,可以用session_id()來設置或者獲取sessionid值,也可以用session_name()來獲取或者設置session.name值。

這裏有個誤區,很多資料都說默認的session失效時間是當客戶端關閉瀏覽器的時候,事實上瀏覽器關閉的時候是不會通知服務器的,服務器也就沒法在客戶端瀏覽器關閉的時候刪除session了。但平時我們確實這樣感覺的,因爲關閉了瀏覽器後在訪問就得重新登錄了,其實原因是這樣的:
雖然服務器檢測不到客戶端關閉從而不能在客戶端關閉的時候刪除session,但是cookie默認是在瀏覽器關閉的時候失效的,而cookie中存儲的sessionid也被刪除了,所以再次登錄的時候也就找不到原來的sesion了。
而session也有個默認的失效時間,過了這個時間就被刪除了。session的失效時間和session的失效時間都是可以手動設置的,這就是自動登錄原理

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