會話技術
Cookie的應用
① Cookie的概述
在現實生活中,如果在商場裏面購買東西,一般都會有會員,這張會員卡,就記錄了用戶的相關信息(姓名,電話號碼,積分信息)。下一次再去商店的時候,只要帶上這一張會員卡,商場方就就可以通過這張會員卡將你信息識別出來。
Cookie相當於就是這張會員卡。當用戶第一次訪問網站的是,服務器端(商場)會將cookie(會員卡)發送到客戶端(用戶),下一次客戶端再次訪問服務器端的時候,就會在HTTP請求裏面自動的將之前的cookie給帶過去,服務器端根據這個cookie就可以識別出該用戶了
② 向客戶端發送cookie
在PHP裏面,發送cookie非常簡單,有一個函數
函數的原型如下:
Setcookie(cookie的名字,cookie的值,cookie的生存時間,cookie的有效目錄,cookie的有效域名,是否通過安全協議HTTPS來傳輸cookie)
關於cookie生存的時間是以當前的時間戳來進行計算的。
如果cookie設置成功,返回true
查看響應頭,可以看到確實是向客戶端發送了cookie信息
當我們訪問其他頁面的時候,HTTP請求裏面就會自動的帶上之前發送過來的cookie
③ 在PHP裏面讀取cookie信息
方法非常簡單,在PHP裏面有一個$_COOKIE[ ]的超全局數組,該超全局數組是用來存放從客戶端發送過來的
如果沒有書寫過期時間,cookie的有效期是多久?
如果沒有書寫cookie,那麽cookie會在瀏覽器關閉的時候過期
⑤ 刪除cookie
如何刪除cookie,方法非常簡單,還是用setcookie函數,只需要value為空,然後時間小於當前系統的時間即可,如下:
Setcookie(cookie名稱,””,time()-100)
還有一種方法更簡單,只要書寫cookie名稱就可以了,但是和上面的方法相比有區別
區別在於這種方法是置空cookie,但是鍵還在。
基於Cookie的登錄模塊
詳細參見【基於cookie的登錄模塊】
Session的應用
為什麽需要session?
Cookie雖然好用,但是有一個很嚴重的問題,那就是不安全,因為所有的信息都是存儲在客戶端裏面,用戶可以隨意修改。還有一個問題,就是用戶可以手動的停止cookie的使用。
所謂session,就是將會員的信息保存在商場(服務器)這一方,而不是用戶(客戶端)那一方。之後用戶(客戶端)在去商場(訪問服務器端)的時候,只需要報出電話號碼(sessionID)即可。所以這個時候,就相當於由服務器端(商場)來保存sessionID(會員卡),但是用戶手上也必須會員卡號(sessionID)。
① 設置session
Session是一種服務器端技術,默認session的有效期從開始訪問網站到關閉瀏覽器。使用session的時候,會生成一個sessionID,用於識別保存在服務器端的sessionID
② Session的配置
通過PHP的配置文件可以修改session的相關配置
Session.auto_start:是否自動啟動session,如果設置為1,則為自動啟動,但是這個選項我們一般不會去改它。
Session.name:session的名字,默認為PHPSESSID
Session.cookie_lifetime:代表cookie有效的時間,單位為秒,如果值為0,代表關閉瀏覽器的時候失效
Session.save_path:session保存的路徑,默認是保存在wamp下面的tmp目錄下
③ 使用session
如果要使用session,那麽首先需要開啟session,在PHP裏面提供了一個函數
Session_start()
該函數有兩個作用:1. 開啟會話環境 2. 檢查客戶端有沒有發送過來sessionID,如果沒有,則自動生成一個sessionID,發送到客戶端。
第一次訪問denglu.php 效果:http響應頭裏面自動生成了一個sessionID並且發送給客戶端
第二次訪問denglu.php的時候,客戶端由於已經有了sessionID,所以會在http請求裏面自動將這個sessionID帶給服務器端,服務器端就會進行相應的查找
④ 向session裏面存入信息
向session裏面存入方法非常簡單,就和我們平時使用數組
我們先用瀏覽器訪問test.php這個時候會發生兩件事情:1. 服務器檢查有沒有從客戶端發送sessionID過來,因為我們是第一次訪問,沒有sessionID從客戶端發送過來,所以服務器自動生成一個sessionID,發送給客戶端。
2. 在服務器下面存儲了2個變量
接下來我們再來訪問test2.php 1.服務器檢查有沒有從客戶端發送sessionID過來,這一次就有sessionID從客戶端發送過來了。2. 接下來服務器將從客戶端發送過來的session和服務器下面的sessionID進行匹配,匹配上之後,就從服務器下面取出相應的值。
⑤ 註銷變量和銷毀session
在PHP裏面有3種方式刪除session中的數據。
(1) 刪除單個數據
語法:unset($_SESSION[‘key’])
效果:註意第一次訪問該頁面還是能夠正常的顯示出兩個值,但是第二次再訪問的時候,
(2) 刪除所有的數據
如果要刪除所有的session數據,unset雖然可以,但是太麻煩了,所以我們可以將一個空數組賦值給session
這種刪除方法雖然刪除了服務器下面對應session的所有數據,但是sessionID還是存在的
(3) 銷毀session
PHP裏面為我們提供了一個函數 session_destory(),調用該函數,會銷毀服務器下面的sessionID
通面的步驟,我們可以將服務器端的session徹底清除,但是客戶端的存放sessionID的cookie還存在。所以我們還需要一個收尾的工作,就是將存放於客戶端的sessionID的cookie也一並刪除掉
⑥ 傳遞sessionID
傳遞sessionID默認是采用的cookie的形式來傳遞,但是客戶端有可能將cookie給禁用掉(當然這種情況很少),如果用戶禁用了cookie,這個時候我們還可以通過get的方式將sessionID附加到URL後面
⑦ Cookie和session的比較
Cookie是存放客戶端,session是存放於服務器端
相比Cookie,session的安全性更高
雖然session相比cookie更安全,但是也有自身的缺點,那就是占用服務器的資源。不過好在一關閉瀏覽器,session就過期了,然後PHP裏面有一個叫做垃圾回收的功能,會定期的刪除掉過期的sessionID。
綜上所述:如果我們要存儲用戶的相關狀態信息,例如等級,金幣,銀幣,使用session,如果是存儲不怎麽重要的,那麽就使用cookie將其存儲到客戶端,以分散服務器的壓力
會話技術