




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于WEB的信息系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)信息工程學(xué)院第九章PHP會(huì)話處理本章知識(shí)點(diǎn)9.1什么是會(huì)話處理9.2Cookie的應(yīng)用9.3Session的應(yīng)用9.1什么是會(huì)話處理9.1.1問題的提出9.1.2解決方案9.1.1問題的提出超文本傳輸協(xié)議(HTTP),它定義了通過互聯(lián)網(wǎng)傳輸數(shù)據(jù)的規(guī)則。HTTP是一種無狀態(tài)的協(xié)議,也就是每次請(qǐng)求都是獨(dú)立的,和之前或之后的請(qǐng)求無關(guān)。這就意味著如果后續(xù)處理需要前面的信息,則必須重傳數(shù)據(jù),這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。
HTTP協(xié)議沒有一個(gè)內(nèi)建機(jī)制來維護(hù)兩個(gè)事物之間的狀態(tài)。當(dāng)一個(gè)用戶在請(qǐng)求一個(gè)頁面后再請(qǐng)求另一個(gè)頁面時(shí),HTTP將無法告訴我們這兩個(gè)請(qǐng)求是來自同一個(gè)用戶。例如,在網(wǎng)上商城系統(tǒng)中,有一些頁面(比如發(fā)表評(píng)價(jià)頁面、購買商品頁面)需要用戶登錄后才能瀏覽。但在打開這些頁面時(shí)系統(tǒng)并不知道訪問者之前是否登錄過,于是就可能出現(xiàn)要求用戶重復(fù)登錄的情況。由于HTTP無狀態(tài)而造成的問題9.1.2解決方案1.Cookie2.Session(會(huì)話)1.CookieCookie(小甜餅)有時(shí)也用其復(fù)數(shù)形式Cookies,指存儲(chǔ)在用戶本地上的少量數(shù)據(jù),最經(jīng)典的Cookie應(yīng)用就是記錄登錄用戶名和密碼,這樣下次訪問時(shí)就不需要輸入自己的用戶名和密碼了。也有一些高級(jí)的Cookie應(yīng)用,例如在網(wǎng)上商城查閱商品時(shí),該商城應(yīng)用程序就可以記錄用戶興趣和瀏覽記錄的Cookies。在下次訪問時(shí),網(wǎng)站根據(jù)情況對(duì)顯示的內(nèi)容進(jìn)行調(diào)整,將用戶所感興趣的內(nèi)容放在前列。Cookie存在如下缺陷Cookie的數(shù)據(jù)大小是由限制的,大多數(shù)瀏覽器只支持最大為4096字節(jié)的Cookie。有時(shí)不能滿足需求。客戶端可以禁用或清空Cookie,從而影響程序的功能。當(dāng)多人共用一臺(tái)計(jì)算機(jī)時(shí)使用Cookie可能會(huì)泄露用戶隱私,帶來安全問題。2.Session(會(huì)話)Session可以保持網(wǎng)站服務(wù)器和網(wǎng)站訪問者的交流,訪問者可以將數(shù)據(jù)保存在網(wǎng)站服務(wù)器中。為了區(qū)分不同的訪問者,網(wǎng)站服務(wù)器為每個(gè)網(wǎng)站訪問者都分配一個(gè)會(huì)話編號(hào)SID,一個(gè)訪問者在Session中保存的所有數(shù)據(jù)都與他的SID相關(guān)聯(lián)。在訪問者打開的所有頁面中,都可以通過SID設(shè)置和獲取Session數(shù)據(jù),因此通過Session可以實(shí)現(xiàn)個(gè)頁面間的數(shù)據(jù)共享。用戶在任意一個(gè)頁面登錄后,都可以將登錄標(biāo)記和登錄用戶名保存在Session變量中。這樣在其他頁面中就可以獲知用戶已經(jīng)登錄了,從而避免重復(fù)登錄。使用Cookie和Session技術(shù)的解決方案9.2Cookie的應(yīng)用9.2.1Cookie的工作原理9.2.2設(shè)置Cookie數(shù)據(jù)9.2.3讀取Cookie數(shù)據(jù)9.2.4刪除Cookie數(shù)據(jù)9.2.5在用戶身份驗(yàn)證時(shí)使用Cookie9.2.1Cookie的工作原理 cookie是一種在遠(yuǎn)程瀏覽器端存儲(chǔ)數(shù)據(jù)并以此來跟蹤和識(shí)別用戶的機(jī)制。簡單說來,Cookie是web服務(wù)器暫時(shí)存儲(chǔ)在用戶硬盤上的一個(gè)文本文件,并且隨后被Web瀏覽器讀取。當(dāng)用戶再次訪問Web網(wǎng)站時(shí),網(wǎng)站會(huì)通過讀取Cookie文件記錄這位訪客的特定信息,從而迅速作出相應(yīng)。
Cookie是Web服務(wù)器存放在用戶硬盤的一段文本,其中存儲(chǔ)著一些“鍵-值”對(duì)。每個(gè)Web站點(diǎn)都可以在用戶的機(jī)器上存放Cookie,并可以在需要時(shí)重新獲取Cookie數(shù)據(jù)。通常Web站點(diǎn)都有一個(gè)Cookie文件。 格式: 用戶名@網(wǎng)站網(wǎng)址[數(shù)字].txtCookie的工作原理
9.2.2設(shè)置Cookie數(shù)據(jù)可以使用setcookie()函數(shù)設(shè)置Cookie數(shù)據(jù),語法如下:bool
setcookie
(
string
$name
[,
string
$value
[,
int
$expire
=0
[,
string
$path
[,
string
$domain
[,
bool
$secure
=false
[,
bool
$httponly
=false
]]]]]])參數(shù)說明如下:name,Cookie的名字。value,Cookie的值。expire,Cookie的有效期,單位為秒。path
,Cookie的服務(wù)器路徑,此目錄下的網(wǎng)頁都能訪問該cookie。domain,Cookie的域名,此域名下的網(wǎng)頁都能訪問該cookie。secure,規(guī)定是否通過安全的HTTPS連接來傳輸cookie。httponly,如果設(shè)置為TRUE,則只能通過HTTP訪問Cookie,不能使用腳本語言(例如JavaScript訪問Cookie)。如果設(shè)置為FALSE,則沒有此限制。如果設(shè)置Cookie數(shù)據(jù)成功,則函數(shù)返回true,否則返回false。提示
Setcookie()函數(shù)會(huì)發(fā)送網(wǎng)頁頭信息給客戶端瀏覽器,瀏覽器會(huì)根據(jù)這些信息設(shè)置本地cookie,而<html>標(biāo)簽是網(wǎng)頁正文,因此必須在頭信息發(fā)送完之后才能發(fā)送,也就是說setcookie()函數(shù)必須在<html>之前才能正常工作。Cookie必須最先輸出,即使在setcookie()函數(shù)前輸一個(gè)HTML標(biāo)記或echo語句,甚至一個(gè)空行都會(huì)導(dǎo)致程序出錯(cuò)?!纠?-1】setcookie()函數(shù)的示例<?php$value="mycookievalue";//發(fā)送一個(gè)簡單的cookiesetcookie("TestCookie",$value,time()+60*60*24*30);?><html><body>...</body></html>例題9-2.php<?phpsetcookie('PHPcookie',);setcookie('PHPcookie',time+3600);//設(shè)置cookie的有效時(shí)間1小時(shí)?>9.2.3讀取Cookie數(shù)據(jù)在PHP中,可以使用$_COOKIE數(shù)組讀取Cookie數(shù)據(jù),方法如下:Cookie值=$_COOKIE[Cookie名]也可以直接使用print_r()函數(shù)打印$_COOKIE數(shù)組的內(nèi)容。例題9-3改進(jìn)【例9-1】,打印$_COOKIE數(shù)組的內(nèi)容,代碼如下:<?php$value="mycookievalue";//發(fā)送一個(gè)簡單的cookiesetcookie("TestCookie",$value,time()+60*60*24*30);?><html><body><?phpif(isset($_COOKIE["TestCookie"]))
echo($_COOKIE["TestCookie"]."<BR>");print_r($_COOKIE);?></body></html>【例9-2】的運(yùn)行結(jié)果
例題9-4<?phpif(!isset($_COOKIE["visittime"])){ //判斷cookie文件是否存在?如果不存在setcookie("visittime",date("Y-m-dH:i:s"),time()+3600);//設(shè)置一個(gè)cookie的變量echo"歡迎您第一次訪問我們的網(wǎng)站";//輸出字符串}else{ //如果cookie存在echo"您上次訪問我們的網(wǎng)站的時(shí)間為:".$_COOKIE["visittime"];//顯示上次設(shè)置的cookie的值setcookie("visittime",date("Y-m-dH:i:s"),time()+3600);//設(shè)置新的cookie,失效時(shí)間為一個(gè)小時(shí)echo"<br>";//換行}?>使用Cookies記錄用戶訪問網(wǎng)頁的次數(shù)<?phpif(isset($_COOKIE["num"])) $num=$_COOKIE["num"];else $num=0; $num=$num+1;//發(fā)送一個(gè)簡單的cookiesetcookie("num",$num,time()+60*60*24*30);?><html><body><?phpif($num>1) echo("您是第".$num."次訪問本站了");else echo("歡迎你首次訪問本站");?><br><br>下面是網(wǎng)頁正文<br></body></html>9.2.4刪除Cookie數(shù)據(jù)當(dāng)Cookie被創(chuàng)建后,如果沒有設(shè)置其到期時(shí)間,相應(yīng)的Cookie文件會(huì)在關(guān)閉瀏覽器時(shí)被自動(dòng)刪除。如果需要在關(guān)閉瀏覽器之前刪除Cookie文件,可以有兩種方法。一種是使用瀏覽器手動(dòng)刪除,另一種則是使用setcookie()函數(shù)刪除。每個(gè)Cookie都有有效期,刪除Cookie實(shí)際上就是將其有效期設(shè)置為過去的時(shí)間。刪除TestCookie,代碼如下:setcookie("TestCookie","",time()-3600);也就是將其有效期設(shè)置為1小時(shí)之前。9.2.5在用戶身份驗(yàn)證時(shí)使用Cookie
前面的章節(jié)介紹了使用表單提交用戶身份認(rèn)證信息的例子,本節(jié)對(duì)該例進(jìn)行完善。用戶可以選擇在登錄成功后,將用戶身份認(rèn)證信息保存在Cookie里,以便下次打開登錄頁面時(shí)自動(dòng)帶入用戶名和密碼。 首先將5.3.1小節(jié)中的login.html改名為login.php,因?yàn)橐谄渲刑砑覲HP程序。在login.php的表單中添加一個(gè)復(fù)選框checkboxCookie,其定義代碼如下: <inputname="checkboxCookie"type="checkbox"checked> 用戶名文本框 在用戶名文本框的定義代碼中增加從Cookie中讀取用戶名信息的功能,具體如下: <inputtype="text"name="txtUserName"value="<?PHPecho($_COOKIE["username"]);?>"size="20"> $_COOKIE["username"]中保存上次成功登錄的用戶名,保存方法將在稍后介紹。密碼文本框 在密碼文本框的定義代碼中增加從Cookie中讀取密碼信息的功能,具體如下:<inputtype="password"name="txtPwd"value="<?PHPecho($_COOKIE["password"]);?>"size="20"> $_COOKIE["password"]中保存上次成功登錄的密碼,保存方法將在稍后介紹。check.php
處理提交的用戶身份認(rèn)證信息的腳本為check.php。在check.php中,判斷是否選中了復(fù)選框checkboxCookie,如果選中且登錄成功,則將用戶信息保存在Cookie中,代碼如下:<?PHP//取輸入的用戶名和密碼
$UID=$_POST['txtUserName'];$PWD=$_POST['txtPwd'];//驗(yàn)證用戶名和密碼
if($UID=="admin"and$PWD=="pass"){echo("您已經(jīng)登錄成功,歡迎光臨。");
if($_POST['checkboxCookie']=="on"){
setcookie("username",$UID,time()+60*60*24*365);
setcookie("password",$PWD,time()+60*60*24*365);}}elseecho("登錄失敗,請(qǐng)返回重新登錄。");?>在登錄頁面中自動(dòng)加載用戶名和密碼在瀏覽器中訪問login.php,登錄成功,關(guān)閉瀏覽器。然后再次在瀏覽器中訪問login.php,確認(rèn)可以自動(dòng)加載用戶名和密碼
9.3Session的應(yīng)用9.3.1Session的工作原理9.3.2開始會(huì)話9.3.3
全局?jǐn)?shù)組$_SESSION9.3.4刪除會(huì)話變量9.3.5銷毀會(huì)話9.3.6配置Session9.3.1Session的工作原理
Session被翻譯成為中文“會(huì)話”,其基本含義是指有始有終的一系列動(dòng)作/消息,例如打電話時(shí)從拿起電話撥號(hào)到掛斷電話這中間的一系列過程可以稱為一個(gè)Session。Session可以實(shí)現(xiàn)客戶端和Web服務(wù)器的會(huì)話,Session數(shù)據(jù)也以“鍵-值”對(duì)的形式存儲(chǔ)在文件中。與Cookie不同,Session數(shù)據(jù)保存在服務(wù)器上。在會(huì)話存續(xù)期間,Web服務(wù)器上的各頁面都可以獲取Session數(shù)據(jù),從而了解與客戶端溝通的歷史記錄。從而避免用戶在瀏覽不同頁面時(shí)重復(fù)輸入數(shù)據(jù)(例如重復(fù)登錄)。 每個(gè)Web站點(diǎn)都同時(shí)與多個(gè)用戶進(jìn)行會(huì)話,那么,Web站點(diǎn)又是如何區(qū)分與它會(huì)話的用戶呢?它會(huì)給每個(gè)訪問者分配一個(gè)會(huì)話ID(SID,session_id)。用戶第1次訪問Web站點(diǎn)時(shí)會(huì)得到Web服務(wù)器分配的會(huì)話ID,以后每次瀏覽器提交請(qǐng)求都會(huì)帶上這個(gè)會(huì)話ID,所有Session數(shù)據(jù)都與會(huì)話ID相關(guān)聯(lián)。Session的工作原理9.3.2開始會(huì)話在PHP腳本中,可以使用session_start()函數(shù)開始會(huì)話,語法如下:bool
session_start(void);如果成功開始了會(huì)話,則函數(shù)返回True;否則返回False。使用session_start()函數(shù)之前瀏覽器不能有任何輸出,否則會(huì)產(chǎn)生錯(cuò)誤。
如果使用參數(shù)$name,則將其設(shè)置為Session的名字;否則直接返回當(dāng)前的Session名。session_start()函數(shù)會(huì)為該會(huì)話隨機(jī)生成一個(gè)SessionID??梢允褂胹ession_id()函數(shù)獲取或設(shè)置SessionID,語法如下stringsession_id([string$id])如果使用參數(shù)$id,則將其設(shè)置為SessionID;否則直接返回當(dāng)前的SessionID。SessionID用于標(biāo)識(shí)一個(gè)Session。除了SessionID,Session還有一個(gè)名字。可以使用session_name()函數(shù)獲取或設(shè)置Session的名字,語法如下:stringsession_name([string$name])【例9-6】
開始會(huì)話并輸出SessionID和Session的名字,代碼如下:<?php
session_start();
echo("session_id()=".session_id());echo("<br>");
echo("session_name()=".session_name());?>
9.3.3全局?jǐn)?shù)組$_SESSION可以使用全局?jǐn)?shù)組$_SESSION設(shè)置和獲取Session數(shù)據(jù),它的用法與普通數(shù)組相同,只是數(shù)組$_SESSION由系統(tǒng)定義,可以在程序的任何位置訪問它。在訪問數(shù)組$_SESSION之前,應(yīng)該調(diào)用session_start()函數(shù)開始會(huì)話【例9-7】
使用全局?jǐn)?shù)組$_SESSION存取Session數(shù)據(jù)的例子。<?php
date_default_timezone_set('Asia/Chongqing');//系統(tǒng)時(shí)間差8小時(shí)問題
//開始會(huì)話
session_start();
if($_SESSION["last_visit"]){echo"您上次訪問的時(shí)間為:";echodate("Y-m-d,H:i:s",$_SESSION["last_visit"]);echo"<br>";echo"訪問次數(shù):".$_SESSION["num_visits"];}elseecho"這是您的第1次訪問。";$_SESSION["last_visit"]=time();$_SESSION["num_visits"]++;?>第1次訪問【例9-6】網(wǎng)頁時(shí)的界面第2次訪及以后訪問【例9-6】網(wǎng)頁時(shí)的界面9.3.4刪除會(huì)話變量對(duì)于不需要保留的輝會(huì)話變量,可以調(diào)用unset()函數(shù)將其刪除,釋放占用的內(nèi)存空間。unset()函數(shù)的語法如下:voidunset(mixed$var[,mixed$var[,$...]])可以看到,unset()函數(shù)可以同時(shí)釋放多個(gè)變量。unset()函數(shù)不僅可以釋放會(huì)話變量,也可以用來釋放普通變量?!纠?-8】
使用unset()函數(shù)釋放會(huì)話變量的例子。<?php//開始會(huì)話
session_start();$_SESSION["num_visits"]++;
unset($_SESSION["num_visits"]);
echo($_SESSION["num_visits"]);?>以腳本運(yùn)行的結(jié)果如下:PHPNotice:Undefinedindex:num_visitsinC:\workspace\test\hello.phponline7PHPStacktrace:PHP1.{main}()C:\workspace\test\hello.php:09.3.5銷毀會(huì)話盡管超過有效期的Session數(shù)據(jù)會(huì)被自動(dòng)銷毀,但也可以使用PHP提供的系統(tǒng)函數(shù)手動(dòng)銷毀會(huì)話。1.session_unset()函數(shù)session_unset()函數(shù)的功能是釋放所有的Session變量,但不刪除session文件以及不釋放對(duì)應(yīng)的sessionID,其語法如下:voidsession_unset(void)【例9-9】使用session_unset()函數(shù)銷毀會(huì)話的例子。<?php
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河北省金科大聯(lián)考2025屆高三3月質(zhì)量檢測(cè)數(shù)學(xué)試卷
- 多發(fā)傷疑難病例護(hù)理討論
- 呼吸心跳驟停護(hù)理個(gè)案
- 辦公室禮儀培訓(xùn)
- 單元七酒店安全管理(公共安全管理)
- 手外科患者的疼痛管理
- 侗族文化介紹
- 陜西省咸陽市2024-2025學(xué)年高三下學(xué)期高考模擬檢測(cè)(二)化學(xué)試題(含答案)
- 截癱病人的并發(fā)癥護(hù)理
- 中國壓縮機(jī)零部件行業(yè)發(fā)展?fàn)顩r及需求潛力預(yù)測(cè)報(bào)告2025-2030年
- 青少年心理咨詢的特殊挑戰(zhàn)試題及答案
- 學(xué)校信息化設(shè)備運(yùn)維服務(wù)方案
- 2025-2030中國奶茶店設(shè)備全套行業(yè)市場(chǎng)現(xiàn)狀分析及競(jìng)爭格局與投資發(fā)展研究報(bào)告
- 2025年江蘇財(cái)經(jīng)職業(yè)技術(shù)學(xué)院單招職業(yè)技能測(cè)試題庫附答案
- 2025年中國人壽招聘筆試筆試參考題庫附帶答案詳解
- 2024-2025學(xué)年高中化學(xué)上學(xué)期第十四周 化學(xué)反應(yīng)速率教學(xué)實(shí)錄
- 2025年初中地理中考押題卷(含解析)
- 2025年湖南省長沙市開福區(qū)審計(jì)局招聘4人歷年高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 人教PEP版英語五年級(jí)下冊(cè)全冊(cè)教案
- 交通大數(shù)據(jù)分析-深度研究
- 基礎(chǔ)護(hù)理學(xué)試題及標(biāo)準(zhǔn)答案
評(píng)論
0/150
提交評(píng)論