第九章 PHP會話處理_第1頁
第九章 PHP會話處理_第2頁
第九章 PHP會話處理_第3頁
第九章 PHP會話處理_第4頁
第九章 PHP會話處理_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

基于WEB的信息系統(tǒng)的設(shè)計與實(shí)現(xiàn)信息工程學(xué)院第九章PHP會話處理本章知識點(diǎn)9.1什么是會話處理9.2Cookie的應(yīng)用9.3Session的應(yīng)用9.1什么是會話處理9.1.1問題的提出9.1.2解決方案9.1.1問題的提出超文本傳輸協(xié)議(HTTP),它定義了通過互聯(lián)網(wǎng)傳輸數(shù)據(jù)的規(guī)則。HTTP是一種無狀態(tài)的協(xié)議,也就是每次請求都是獨(dú)立的,和之前或之后的請求無關(guān)。這就意味著如果后續(xù)處理需要前面的信息,則必須重傳數(shù)據(jù),這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。

HTTP協(xié)議沒有一個內(nèi)建機(jī)制來維護(hù)兩個事物之間的狀態(tài)。當(dāng)一個用戶在請求一個頁面后再請求另一個頁面時,HTTP將無法告訴我們這兩個請求是來自同一個用戶。例如,在網(wǎng)上商城系統(tǒng)中,有一些頁面(比如發(fā)表評價頁面、購買商品頁面)需要用戶登錄后才能瀏覽。但在打開這些頁面時系統(tǒng)并不知道訪問者之前是否登錄過,于是就可能出現(xiàn)要求用戶重復(fù)登錄的情況。由于HTTP無狀態(tài)而造成的問題9.1.2解決方案1.Cookie2.Session(會話)1.CookieCookie(小甜餅)有時也用其復(fù)數(shù)形式Cookies,指存儲在用戶本地上的少量數(shù)據(jù),最經(jīng)典的Cookie應(yīng)用就是記錄登錄用戶名和密碼,這樣下次訪問時就不需要輸入自己的用戶名和密碼了。也有一些高級的Cookie應(yīng)用,例如在網(wǎng)上商城查閱商品時,該商城應(yīng)用程序就可以記錄用戶興趣和瀏覽記錄的Cookies。在下次訪問時,網(wǎng)站根據(jù)情況對顯示的內(nèi)容進(jìn)行調(diào)整,將用戶所感興趣的內(nèi)容放在前列。Cookie存在如下缺陷Cookie的數(shù)據(jù)大小是由限制的,大多數(shù)瀏覽器只支持最大為4096字節(jié)的Cookie。有時不能滿足需求??蛻舳丝梢越没蚯蹇誄ookie,從而影響程序的功能。當(dāng)多人共用一臺計算機(jī)時使用Cookie可能會泄露用戶隱私,帶來安全問題。2.Session(會話)Session可以保持網(wǎng)站服務(wù)器和網(wǎng)站訪問者的交流,訪問者可以將數(shù)據(jù)保存在網(wǎng)站服務(wù)器中。為了區(qū)分不同的訪問者,網(wǎng)站服務(wù)器為每個網(wǎng)站訪問者都分配一個會話編號SID,一個訪問者在Session中保存的所有數(shù)據(jù)都與他的SID相關(guān)聯(lián)。在訪問者打開的所有頁面中,都可以通過SID設(shè)置和獲取Session數(shù)據(jù),因此通過Session可以實(shí)現(xiàn)個頁面間的數(shù)據(jù)共享。用戶在任意一個頁面登錄后,都可以將登錄標(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)證時使用Cookie9.2.1Cookie的工作原理 cookie是一種在遠(yuǎn)程瀏覽器端存儲數(shù)據(jù)并以此來跟蹤和識別用戶的機(jī)制。簡單說來,Cookie是web服務(wù)器暫時存儲在用戶硬盤上的一個文本文件,并且隨后被Web瀏覽器讀取。當(dāng)用戶再次訪問Web網(wǎng)站時,網(wǎng)站會通過讀取Cookie文件記錄這位訪客的特定信息,從而迅速作出相應(yīng)。

Cookie是Web服務(wù)器存放在用戶硬盤的一段文本,其中存儲著一些“鍵-值”對。每個Web站點(diǎn)都可以在用戶的機(jī)器上存放Cookie,并可以在需要時重新獲取Cookie數(shù)據(jù)。通常Web站點(diǎn)都有一個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ù)會發(fā)送網(wǎng)頁頭信息給客戶端瀏覽器,瀏覽器會根據(jù)這些信息設(shè)置本地cookie,而<html>標(biāo)簽是網(wǎng)頁正文,因此必須在頭信息發(fā)送完之后才能發(fā)送,也就是說setcookie()函數(shù)必須在<html>之前才能正常工作。Cookie必須最先輸出,即使在setcookie()函數(shù)前輸一個HTML標(biāo)記或echo語句,甚至一個空行都會導(dǎo)致程序出錯?!纠?-1】setcookie()函數(shù)的示例<?php$value="mycookievalue";//發(fā)送一個簡單的cookiesetcookie("TestCookie",$value,time()+60*60*24*30);?><html><body>...</body></html>例題9-2.php<?phpsetcookie('PHPcookie',);setcookie('PHPcookie',time+3600);//設(shè)置cookie的有效時間1小時?>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ā)送一個簡單的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è)置一個cookie的變量echo"歡迎您第一次訪問我們的網(wǎng)站";//輸出字符串}else{ //如果cookie存在echo"您上次訪問我們的網(wǎng)站的時間為:".$_COOKIE["visittime"];//顯示上次設(shè)置的cookie的值setcookie("visittime",date("Y-m-dH:i:s"),time()+3600);//設(shè)置新的cookie,失效時間為一個小時echo"<br>";//換行}?>使用Cookies記錄用戶訪問網(wǎng)頁的次數(shù)<?phpif(isset($_COOKIE["num"])) $num=$_COOKIE["num"];else $num=0; $num=$num+1;//發(fā)送一個簡單的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è)置其到期時間,相應(yīng)的Cookie文件會在關(guān)閉瀏覽器時被自動刪除。如果需要在關(guān)閉瀏覽器之前刪除Cookie文件,可以有兩種方法。一種是使用瀏覽器手動刪除,另一種則是使用setcookie()函數(shù)刪除。每個Cookie都有有效期,刪除Cookie實(shí)際上就是將其有效期設(shè)置為過去的時間。刪除TestCookie,代碼如下:setcookie("TestCookie","",time()-3600);也就是將其有效期設(shè)置為1小時之前。9.2.5在用戶身份驗(yàn)證時使用Cookie

前面的章節(jié)介紹了使用表單提交用戶身份認(rèn)證信息的例子,本節(jié)對該例進(jìn)行完善。用戶可以選擇在登錄成功后,將用戶身份認(rèn)證信息保存在Cookie里,以便下次打開登錄頁面時自動帶入用戶名和密碼。 首先將5.3.1小節(jié)中的login.html改名為login.php,因?yàn)橐谄渲刑砑覲HP程序。在login.php的表單中添加一個復(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("登錄失敗,請返回重新登錄。");?>在登錄頁面中自動加載用戶名和密碼在瀏覽器中訪問login.php,登錄成功,關(guān)閉瀏覽器。然后再次在瀏覽器中訪問login.php,確認(rèn)可以自動加載用戶名和密碼

9.3Session的應(yīng)用9.3.1Session的工作原理9.3.2開始會話9.3.3

全局?jǐn)?shù)組$_SESSION9.3.4刪除會話變量9.3.5銷毀會話9.3.6配置Session9.3.1Session的工作原理

Session被翻譯成為中文“會話”,其基本含義是指有始有終的一系列動作/消息,例如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱為一個Session。Session可以實(shí)現(xiàn)客戶端和Web服務(wù)器的會話,Session數(shù)據(jù)也以“鍵-值”對的形式存儲在文件中。與Cookie不同,Session數(shù)據(jù)保存在服務(wù)器上。在會話存續(xù)期間,Web服務(wù)器上的各頁面都可以獲取Session數(shù)據(jù),從而了解與客戶端溝通的歷史記錄。從而避免用戶在瀏覽不同頁面時重復(fù)輸入數(shù)據(jù)(例如重復(fù)登錄)。 每個Web站點(diǎn)都同時與多個用戶進(jìn)行會話,那么,Web站點(diǎn)又是如何區(qū)分與它會話的用戶呢?它會給每個訪問者分配一個會話ID(SID,session_id)。用戶第1次訪問Web站點(diǎn)時會得到Web服務(wù)器分配的會話ID,以后每次瀏覽器提交請求都會帶上這個會話ID,所有Session數(shù)據(jù)都與會話ID相關(guān)聯(lián)。Session的工作原理9.3.2開始會話在PHP腳本中,可以使用session_start()函數(shù)開始會話,語法如下:bool

session_start(void);如果成功開始了會話,則函數(shù)返回True;否則返回False。使用session_start()函數(shù)之前瀏覽器不能有任何輸出,否則會產(chǎn)生錯誤。

如果使用參數(shù)$name,則將其設(shè)置為Session的名字;否則直接返回當(dāng)前的Session名。session_start()函數(shù)會為該會話隨機(jī)生成一個SessionID。可以使用session_id()函數(shù)獲取或設(shè)置SessionID,語法如下stringsession_id([string$id])如果使用參數(shù)$id,則將其設(shè)置為SessionID;否則直接返回當(dāng)前的SessionID。SessionID用于標(biāo)識一個Session。除了SessionID,Session還有一個名字。可以使用session_name()函數(shù)獲取或設(shè)置Session的名字,語法如下:stringsession_name([string$name])【例9-6】

開始會話并輸出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ù)開始會話【例9-7】

使用全局?jǐn)?shù)組$_SESSION存取Session數(shù)據(jù)的例子。<?php

date_default_timezone_set('Asia/Chongqing');//系統(tǒng)時間差8小時問題

//開始會話

session_start();

if($_SESSION["last_visit"]){echo"您上次訪問的時間為:";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)頁時的界面第2次訪及以后訪問【例9-6】網(wǎng)頁時的界面9.3.4刪除會話變量對于不需要保留的輝會話變量,可以調(diào)用unset()函數(shù)將其刪除,釋放占用的內(nèi)存空間。unset()函數(shù)的語法如下:voidunset(mixed$var[,mixed$var[,$...]])可以看到,unset()函數(shù)可以同時釋放多個變量。unset()函數(shù)不僅可以釋放會話變量,也可以用來釋放普通變量?!纠?-8】

使用unset()函數(shù)釋放會話變量的例子。<?php//開始會話

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銷毀會話盡管超過有效期的Session數(shù)據(jù)會被自動銷毀,但也可以使用PHP提供的系統(tǒng)函數(shù)手動銷毀會話。1.session_unset()函數(shù)session_unset()函數(shù)的功能是釋放所有的Session變量,但不刪除session文件以及不釋放對應(yīng)的sessionID,其語法如下:voidsession_unset(void)【例9-9】使用session_unset()函數(shù)銷毀會話的例子。<?php

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論