官术网_书友最值得收藏!

11章 Cookie與Session

視頻講解:44分鐘

Cookie和Session是兩種不同的存儲(chǔ)機(jī)制,前者是從一個(gè)Web頁到下一個(gè)頁面的數(shù)據(jù)傳遞方法,存儲(chǔ)在客戶端;后者是讓數(shù)據(jù)在頁面中持續(xù)有效的方法,存儲(chǔ)在服務(wù)器端。可以說,掌握Cookie和Session技術(shù),對于Web網(wǎng)站頁面間信息傳遞的安全性是必不可少的。

學(xué)習(xí)摘要:

Cookie概述

創(chuàng)建、讀取、刪除Cookie

Cookie應(yīng)用案例

Session概述

創(chuàng)建、讀取、刪除Session

Session應(yīng)用案例

當(dāng)我們運(yùn)行一個(gè)應(yīng)用程序時(shí)(如QQ),會(huì)打開它,做些操作,然后關(guān)閉它。這很像一次會(huì)話。計(jì)算機(jī)清楚我們是誰,它知道我們何時(shí)啟動(dòng)應(yīng)用程序,并在何時(shí)終止。但是在Internet上,存在一個(gè)問題:服務(wù)器不知道我們是誰以及我們做什么,這是因?yàn)镠TTP地址不能維持狀態(tài)。所以需要通過在服務(wù)器上存儲(chǔ)用戶信息以便后面使用,Cookie和Session解決了這個(gè)問題(如保存用戶名稱、購買商品等)。不過,會(huì)話信息是臨時(shí)的,在用戶離開網(wǎng)站后或會(huì)話過期后將被刪除。如果需要永久儲(chǔ)存信息,可以把數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中。下面就學(xué)習(xí)Cookie和Session的相關(guān)知識。

11.1 Cookie管理

視頻講解

Cookie是在HTTP下,服務(wù)器或腳本可以維護(hù)客戶工作站上信息的一種方式。Cookie的使用很普遍,許多提供個(gè)人化服務(wù)的網(wǎng)站都是利用Cookie來區(qū)別不同用戶,以顯示與用戶相應(yīng)的內(nèi)容,如Web接口的免費(fèi)E-mail網(wǎng)站,就需要用到Cookie。有效地使用Cookie可以輕松完成很多復(fù)雜任務(wù)。下面對Cookie的相關(guān)知識進(jìn)行詳細(xì)介紹。

11.1.1 了解Cookie
1.什么是Cookie

Cookie是一種在遠(yuǎn)程瀏覽器端存儲(chǔ)數(shù)據(jù)并以此來跟蹤和識別用戶的機(jī)制。簡單地說,Cookie是Web服務(wù)器暫時(shí)存儲(chǔ)在用戶硬盤上的一個(gè)文本文件,并隨后被Web瀏覽器讀取。當(dāng)用戶再次訪問Web網(wǎng)站時(shí),網(wǎng)站通過讀取Cookie文件記錄這位訪客的特定信息(如上次訪問的位置、花費(fèi)的時(shí)間、用戶名和密碼等),從而迅速做出響應(yīng),如在頁面中不需要輸入用戶的ID和密碼即可直接登錄網(wǎng)站等。

舉個(gè)簡單的例子,如果用戶的系統(tǒng)盤為C盤,操作系統(tǒng)為Windows 7,當(dāng)使用IE瀏覽器訪問Web網(wǎng)站時(shí),Web服務(wù)器會(huì)生成相應(yīng)的Cookie文本文件,并存儲(chǔ)在用戶硬盤的指定位置,如圖11.1所示。

圖11.1 Cookie文件的存儲(chǔ)路徑

說明

谷歌瀏覽器(Google Chrome)的Cookie數(shù)據(jù)位于C:\Users\Administrator\AppData\Local\Google\ Chrome\User Data\Default\Cookies。其中,Administrator是計(jì)算機(jī)用戶名。在IE瀏覽器中,IE將各個(gè)站點(diǎn)的Cookie分別保存為一個(gè)XXX.txt這樣的純文本文件(文件個(gè)數(shù)可能很多,但文件都較小);而Firefox和Chrome是將所有的Cookie都保存在一個(gè)文件中(文件較大),該文件為SQLite3數(shù)據(jù)庫格式的文件。

2.Cookie的功能

Web服務(wù)器可以應(yīng)用Cookies包含信息的任意性來篩選并經(jīng)常性維護(hù)這些信息,以判斷在HTTP傳輸中的狀態(tài)。Cookie常用于以下3個(gè)方面。

記錄訪客的某些信息。如可以利用Cookie記錄用戶訪問網(wǎng)頁的次數(shù),或者記錄訪客曾經(jīng)輸入過的信息,另外,某些網(wǎng)站可以使用Cookie自動(dòng)記錄訪客上次登錄的用戶名。

在頁面之間傳遞變量。瀏覽器并不會(huì)保存當(dāng)前頁面上的任何變量信息,當(dāng)頁面被關(guān)閉時(shí),頁面上的所有變量信息將隨之消失。如果用戶聲明一個(gè)變量id=8,要把這個(gè)變量傳遞到另一個(gè)頁面,可以把變量id以Cookie形式保存下來,然后在下一頁通過讀取該Cookie來獲取變量的值。

將所查看的Internet頁存儲(chǔ)在Cookies臨時(shí)文件夾中,可以提高以后瀏覽的速度。

注意

一般不要用Cookie保存數(shù)據(jù)集或其他大量數(shù)據(jù)。并非所有的瀏覽器都支持Cookie,并且數(shù)據(jù)信息是以明文文本的形式保存在客戶端計(jì)算機(jī)中,因此最好不要保存敏感的、未加密的數(shù)據(jù),否則會(huì)影響網(wǎng)絡(luò)的安全性。

11.1.2 創(chuàng)建Cookie

在PHP中通過setcookie()函數(shù)創(chuàng)建Cookie。在創(chuàng)建Cookie之前必須了解的是,Cookie是HTTP頭標(biāo)的組成部分,而頭標(biāo)必須在頁面其他內(nèi)容之前發(fā)送,它必須最先輸出。若在setcookie()函數(shù)前輸出一個(gè)HTML標(biāo)記或echo語句,甚至一個(gè)空行都會(huì)導(dǎo)致程序出錯(cuò)。其語法格式如下:

setcookie()函數(shù)的參數(shù)說明如表11.1所示。

例如,使用setcookie()函數(shù)創(chuàng)建Cookie,代碼如下:

表11.1 setcookie()函數(shù)的參數(shù)說明

在谷歌瀏覽器下運(yùn)行本實(shí)例,按如下步驟查看Cookie。

首先右擊瀏覽器頁面,在彈出的如圖11.2所示快捷菜單中選擇“檢查”命令。在彈出的對話框中單擊Application后,在對話框左側(cè)選擇Storage→Cookies→http://localhost,即可看到Cookie內(nèi)容,操作步驟如圖11.3所示。

圖11.2 選擇“檢查”命令

圖11.3 查看Cookie

11.1.3 讀取Cookie

在PHP中可以直接通過超級全局?jǐn)?shù)組$_COOKIE[]來讀取客戶端的Cookie值。

例如,使用$_COOKIE[]讀取Cookie變量,代碼如下:

在上面的代碼中,首先使用isset()函數(shù)檢測Cookie文件是否存在,如果不存在,則使用setcookie()函數(shù)創(chuàng)建一個(gè)Cookie,并輸出相應(yīng)的字符串;如果Cookie文件存在,則使用setcookie()函數(shù)設(shè)置Cookie文件失效的時(shí)間,并輸出用戶上次訪問網(wǎng)站的時(shí)間。最后在頁面輸出本次訪問網(wǎng)站的當(dāng)前時(shí)間。

首次運(yùn)行本實(shí)例,由于沒有檢測到Cookie文件,運(yùn)行結(jié)果如圖11.4所示。如果用戶在Cookie設(shè)置到期時(shí)間(本例為60秒)前刷新或再次訪問該實(shí)例,運(yùn)行結(jié)果如圖11.5所示。

圖11.4 第一次訪問網(wǎng)頁的運(yùn)行結(jié)果

圖11.5 刷新或再次訪問本網(wǎng)頁后的運(yùn)行結(jié)果

注意

如果未設(shè)置Cookie的到期時(shí)間,則在關(guān)閉瀏覽器時(shí)自動(dòng)刪除Cookie數(shù)據(jù)。如果為Cookie設(shè)置了到期時(shí)間,瀏覽器將會(huì)記住Cookie數(shù)據(jù),即使用戶重啟計(jì)算機(jī),只要沒到期,再訪問網(wǎng)站時(shí)也會(huì)獲得如圖11.5所示的數(shù)據(jù)信息。

11.1.4 刪除Cookie

當(dāng)Cookie被創(chuàng)建后,如果沒有設(shè)置它的失效時(shí)間,其Cookie文件會(huì)在關(guān)閉瀏覽器時(shí)被自動(dòng)刪除。如果要在關(guān)閉瀏覽器之前刪除Cookie文件,方法有兩種:一種是使用setcookie()函數(shù)刪除,另一種是在瀏覽器中手動(dòng)刪除Cookie。下面分別進(jìn)行介紹。

1.使用setcookie()函數(shù)刪除Cookie

刪除Cookie和創(chuàng)建Cookie的方式基本類似,刪除Cookie也使用setcookie()函數(shù)。刪除Cookie只需要將setcookie()函數(shù)中的第二個(gè)參數(shù)設(shè)置為空值,將第3個(gè)參數(shù)Cookie的過期時(shí)間設(shè)置為小于系統(tǒng)的當(dāng)前時(shí)間即可。

例如,將Cookie的過期時(shí)間設(shè)置為當(dāng)前時(shí)間減1秒,代碼如下:

在上面的代碼中,time()函數(shù)返回以秒表示的當(dāng)前時(shí)間戳,把過期時(shí)間減1秒就會(huì)得到過去的時(shí)間,從而刪除Cookie。

注意

把過期時(shí)間設(shè)置為0,可以直接刪除Cookie。

2.在瀏覽器中手動(dòng)刪除Cookie

在使用Cookie時(shí),Cookie自動(dòng)生成一個(gè)文本文件存儲(chǔ)在客戶端計(jì)算機(jī)上。不同瀏覽器或者同一瀏覽器不同版本(如IE 6和IE 11)手動(dòng)刪除Cookie的方式都不相同。

11.1.5 Cookie的生命周期

如果Cookie不設(shè)定時(shí)間,就表示它的生命周期為瀏覽器會(huì)話的時(shí)間,只要關(guān)閉瀏覽器,Cookie就會(huì)自動(dòng)消失。這種Cookie被稱為會(huì)話Cookie,一般不保存在硬盤上,而是保存在內(nèi)存中。

如果設(shè)置了過期時(shí)間,那么瀏覽器會(huì)把Cookie保存到硬盤中,再次打開瀏覽器時(shí)會(huì)依然有效,直到它的有效期超時(shí)。

雖然Cookie可以長期保存在客戶端瀏覽器中,但也不是一成不變的。因?yàn)闉g覽器最多允許存儲(chǔ)300個(gè)Cookie文件,而且每個(gè)Cookie文件支持最大容量為4KB;每個(gè)域名最多支持20個(gè)Cookie,如果達(dá)到限制時(shí),瀏覽器會(huì)自動(dòng)地隨機(jī)刪除Cookie。

11.1.6 7天免登錄功能的實(shí)現(xiàn)

登錄明日學(xué)院網(wǎng)站時(shí),有一個(gè)“7天免登錄”功能選項(xiàng)。當(dāng)選擇這個(gè)選項(xiàng)并登錄成功后,7天之內(nèi)瀏覽明日學(xué)院網(wǎng)站,就不需要再次登錄,網(wǎng)站會(huì)為用戶保留登錄信息。下面就來實(shí)現(xiàn)這個(gè)功能。

【例11.01】 實(shí)現(xiàn)7天免登錄功能。實(shí)例位置:資源包\源碼\11\11.01

實(shí)現(xiàn)7天免登錄功能的具體步驟如下。

(1)創(chuàng)建數(shù)據(jù)表。創(chuàng)建database11數(shù)據(jù)庫,在該數(shù)據(jù)庫中創(chuàng)建users數(shù)據(jù)表及數(shù)據(jù)。SQL語句如下:

創(chuàng)建完成后,如圖11.6所示。

圖11.6 新增users表及數(shù)據(jù)

(2)創(chuàng)建登錄頁。創(chuàng)建一個(gè)login.php文件,該文件中包含一個(gè)<form>表單,表單內(nèi)有“用戶名”“密碼”“7天免登錄”3個(gè)字段。login.php文件的具體代碼如下:

上述代碼中,使用checkbox復(fù)選框,設(shè)置屬性為checked,即表示默認(rèn)情況下是選中狀態(tài)。如果用戶選中“7天免登錄”,則該復(fù)選框的value值為1,否則為空,運(yùn)行效果如圖11.7所示。

圖11.7 登錄頁面

(3)檢測是否登錄成功。當(dāng)用戶在填寫完“用戶名”和“密碼”后,單擊“提交”按鈕,將表單提交到checkLogin.php文件。在該文件中,處理業(yè)務(wù)邏輯。首先,以PDO方式連接數(shù)據(jù)庫,然后在users表中查找用戶名和密碼。如果存在這條記錄,則判斷用戶是否選中“7天免登錄”。如果選中,則將用戶名存入Cookie,保存7天,否則使用Cookie的默認(rèn)保存時(shí)間。如果不存在這條記錄,則直接提示“用戶名和密碼不匹配”。checkLogin.php文件的具體代碼如下:

輸入用戶名mr,密碼mrsoft,登錄成功后,運(yùn)行效果如圖11.8所示。輸入錯(cuò)誤的用戶名或密碼登錄時(shí),運(yùn)行效果如圖11.9所示。

圖11.8 登錄成功

圖11.9 登錄失敗

(4)自動(dòng)登錄。登錄成功后,頁面跳轉(zhuǎn)到index.php文件。該文件中,判斷$_COOKIE ['username']是否存在,如果存在,表示登錄成功,顯示該頁面,否則跳轉(zhuǎn)到登錄頁。如果選中“7天免登錄”文選框,當(dāng)關(guān)閉index.php頁面后,再次訪問該頁面,會(huì)直接顯示頁面內(nèi)容,而不需要重新登錄。index. php文件的具體代碼如下:

運(yùn)行效果如圖11.10所示。

圖11.10 index.php頁面效果

(5)退出登錄。在index.php頁面中單擊“退出登錄”按鈕,頁面跳轉(zhuǎn)到logout.php文件。該文件中,使用setcookie()函數(shù)刪除Cookie,并跳轉(zhuǎn)到登錄頁面。此時(shí),再次訪問index.php頁面,由于Cookie已經(jīng)被刪除,所以還會(huì)跳轉(zhuǎn)到login.php登錄頁面。logout.php文件的代碼如下:

11.2 Session管理

視頻講解

對比Cookie,Session文件中保存的數(shù)據(jù)是以變量的形式創(chuàng)建的,創(chuàng)建的會(huì)話變量在生命周期(24分鐘)中可以被跨頁的請求所引用。另外,Session是存儲(chǔ)在服務(wù)器端的會(huì)話,相對安全,并且不像Cookie那樣有存儲(chǔ)長度的限制。

11.2.1 了解Session
1.什么是Session

Session譯為“會(huì)話”,其本義是指有始有終的一系列動(dòng)作/消息,如打電話時(shí)從拿起電話撥號到掛斷電話這一系列過程可以稱為一個(gè)Session。

在計(jì)算機(jī)專業(yè)術(shù)語中,Session是指一個(gè)終端用戶與交互系統(tǒng)進(jìn)行通信的時(shí)間間隔,通常指從注冊進(jìn)入系統(tǒng)到注銷退出系統(tǒng)所經(jīng)過的時(shí)間。因此,Session實(shí)際上是一個(gè)特定的時(shí)間概念。

2.Session工作原理

當(dāng)啟動(dòng)一個(gè)Session會(huì)話時(shí),會(huì)生成一個(gè)隨機(jī)且唯一的session_id,也就是Session的文件名,此時(shí)session_id存儲(chǔ)在服務(wù)器的內(nèi)存中,當(dāng)關(guān)閉頁面時(shí)此id會(huì)自動(dòng)注銷,重新登錄此頁面,會(huì)再次生成一個(gè)隨機(jī)且唯一的id。

3.Session的功能

Session在Web技術(shù)中非常重要。由于網(wǎng)頁是一種無狀態(tài)的連接程序,因此無法得知用戶的瀏覽狀態(tài)。通過Session則可記錄用戶的有關(guān)信息,以供用戶再次以此身份對Web服務(wù)器提交要求時(shí)做確認(rèn)。例如,在電子商務(wù)網(wǎng)站中,通過Session記錄用戶登錄的信息,以及用戶所購買的商品,如果沒有Session,那么用戶每進(jìn)入一個(gè)頁面都需要登錄一次用戶名和密碼。

另外,Session會(huì)話適用于存儲(chǔ)信息量比較少的情況。如果用戶需要存儲(chǔ)的信息量相對較少,并且對存儲(chǔ)內(nèi)容不需要長期存儲(chǔ),那么使用Session把信息存儲(chǔ)到服務(wù)器端比較合適。

11.2.2 創(chuàng)建會(huì)話

創(chuàng)建一個(gè)會(huì)話需要通過以下步驟:

啟動(dòng)會(huì)話→存儲(chǔ)會(huì)話→讀取會(huì)話→刪除會(huì)話。

1.啟動(dòng)會(huì)話

使用session_start()函數(shù)啟動(dòng)PHP會(huì)話。其語法格式如下:

注意

通常,session_start()函數(shù)在頁面開始位置調(diào)用,會(huì)話變量將會(huì)被存儲(chǔ)到$_SESSION中。

2.存儲(chǔ)會(huì)話

開啟會(huì)話之后,就可以使用$_SESSION變量來存取信息。我們要知道的是$_SESSION變量是個(gè)數(shù)組。當(dāng)要把信息存入Session時(shí),可編寫如下代碼:

例如,判斷存儲(chǔ)用戶名的Session會(huì)話變量是否為空,如果不為空,則將該會(huì)話變量賦給$myvalue,代碼如下:

3.讀取會(huì)話

讀取會(huì)話很簡單,就像使用數(shù)組一樣,代碼如下:

4.刪除會(huì)話

刪除會(huì)話的方法主要有刪除單個(gè)會(huì)話、刪除多個(gè)會(huì)話和結(jié)束當(dāng)前會(huì)話3種,下面分別進(jìn)行介紹。

(1)刪除單個(gè)會(huì)話

刪除會(huì)話變量,同數(shù)組的操作一樣,直接注銷$_SESSION數(shù)組的某個(gè)元素即可。

例如,注銷$_SESSION['user']變量,可以使用unset()函數(shù),代碼如下:

注意

使用unset()函數(shù)時(shí),要注意$_SESSION數(shù)組中某元素不能省略,即不可以一次注銷整個(gè)數(shù)組,這樣會(huì)禁止整個(gè)會(huì)話的功能,如unset($_SESSION)函數(shù)會(huì)將全局變量$_SESSION銷毀,而且沒有辦法將其恢復(fù),用戶也不能再注冊$_SESSION變量。如果要?jiǎng)h除多個(gè)或全部會(huì)話,可采用下面的兩種方法。

(2)刪除多個(gè)會(huì)話

如果想要一次注銷所有的會(huì)話變量,可以將一個(gè)空的數(shù)組賦值給$_SESSION,代碼如下:

(3)結(jié)束當(dāng)前會(huì)話

如果整個(gè)會(huì)話已經(jīng)結(jié)束,首先應(yīng)該注銷所有的會(huì)話變量,然后使用session_destroy()函數(shù)清除結(jié)束當(dāng)前的會(huì)話,并清空會(huì)話中的所有資源,徹底銷毀Session,代碼如下:

11.2.3 使用Session實(shí)現(xiàn)判斷用戶登錄功能

Cookie數(shù)據(jù)存儲(chǔ)在客戶的瀏覽器上,Session數(shù)據(jù)存儲(chǔ)在服務(wù)器上;Cookie數(shù)據(jù)不安全,別人可以分享存放在本地的Cookie并進(jìn)行Cookie欺騙,考慮到安全性應(yīng)當(dāng)使用Session。

【例11.02】 使用Session實(shí)現(xiàn)判斷用戶是否登錄。實(shí)例位置:資源包\源碼\11\11.02

本實(shí)例通過Session技術(shù)實(shí)現(xiàn)如何判斷用戶是否登錄。具體開發(fā)步驟如下。

(1)創(chuàng)建login.php文件作為登錄頁面,該頁面與例11.01登錄頁面相似。關(guān)鍵代碼如下:

運(yùn)行效果如圖11.11所示。

圖11.11 登錄頁面

(2)單擊“提交”按鈕,表單提交到checkLogin.php文件。在該文件中處理登錄邏輯。登錄成功后,使用session_start()函數(shù)初始化$_SESSION變量,將username存儲(chǔ)到Session中。關(guān)鍵代碼如下:

運(yùn)行效果如例11.01中圖11.8和圖11.9所示。

(3)登錄成功后,username存儲(chǔ)在Session中,可以使用$_SESSION['username']獲取到該值。在index.php中,關(guān)鍵代碼如下:

運(yùn)行效果與例11.01相同。

(4)退出登錄。創(chuàng)建logout.php文件,使用unset()函數(shù)清除Session。代碼如下:

清除Session后,再次訪問index.php文件,頁面將跳轉(zhuǎn)到登錄頁。

注意

使用Session前,一定要先開啟session_start(),否則提示“$_SESSION不存在”。

11.3 小結(jié)

本章主要介紹了Cookie和Session的基礎(chǔ)知識,包括它們的創(chuàng)建、讀取以及刪除,并且重點(diǎn)介紹了它們的一些高級應(yīng)用。通過完整的實(shí)例,使讀者加深對Cookie和Session的理解及運(yùn)用。希望通過本章的學(xué)習(xí),讀者能夠了解Cookie和Session的關(guān)系和區(qū)別,以及它們各自的應(yīng)用場景。

11.4 實(shí)戰(zhàn)

11.4.1 實(shí)現(xiàn)聊天室換膚的功能

實(shí)例位置:資源包\源碼\11\實(shí)戰(zhàn)\01

應(yīng)用Session可以在頁面?zhèn)鬟f數(shù)據(jù)的特性,實(shí)現(xiàn)聊天室換膚的功能。單擊不同的顏色值,更換聊天室的背景顏色。運(yùn)行效果如圖11.12所示。

圖11.12 更換聊天室背景顏色

11.4.2 實(shí)現(xiàn)加入購物車的功能

實(shí)例位置:資源包\源碼\11\實(shí)戰(zhàn)\02

模擬京東商城購物車,創(chuàng)建一個(gè)goods商品表和一個(gè)order訂單表,使用Session,實(shí)現(xiàn)用戶在未登錄情況下,加入購物車的功能,如圖11.13所示。

圖11.13 加入購物車

主站蜘蛛池模板: 姚安县| 潼关县| 义乌市| 平江县| 星座| 大新县| 九龙县| 鄂托克前旗| 千阳县| 辛集市| 封丘县| 伊吾县| 东丰县| 苍梧县| 云南省| 嘉义县| 桦南县| 阜康市| 湛江市| 镇康县| 桑日县| 东台市| 江山市| 墨脱县| 鹿邑县| 台州市| 乌审旗| 靖州| 即墨市| 唐海县| 拉萨市| 湘乡市| 托里县| 乌兰察布市| 新乐市| 泉州市| 天门市| 赫章县| 老河口市| 长葛市| 浠水县|