11.1案例介紹
登錄
11.2分析案例
用戶登錄時為避免每一個鏈接都驗證用戶信息,所以使用會話控制技術(shù)微姊,來記錄用戶的登錄狀態(tài)
11.3核心知識
會話控制概述、cookie工作原理及使用方法、session工作原理及使用方法
11.4知識講解
11.4.1會話控制概述
當靜態(tài)網(wǎng)站發(fā)展到動態(tài)網(wǎng)站時业扒,我們需要面對維護某種狀態(tài),逐漸的出現(xiàn)了會話控制舒萎。
http是一個無狀態(tài)的協(xié)議,此協(xié)議無法來維護兩個事務(wù)之間的聯(lián)系程储。
如何理解HTTP協(xié)議本身是無狀態(tài)的?
我們上網(wǎng)都要靠HTTP協(xié)議傳遞信息臂寝。比如我們在瀏覽器里鍵入:http://www.bokee.com/這個網(wǎng)址并回車虱肄,你會發(fā)現(xiàn)網(wǎng)址會變成:http://www.bokee.com/,其原因就是瀏覽的網(wǎng)頁是基于http協(xié)議的交煞。http協(xié)議無法記錄用戶經(jīng)常上哪些網(wǎng)站咏窿,有什么愛好,也無法記錄用戶的ID帳號和密碼素征。這就是所謂的HTTP協(xié)議無狀態(tài)集嵌。HTTP協(xié)議本身是無狀態(tài)的萝挤,這與HTTP協(xié)議本來的目的是相符的,客戶端只需要簡單的向服務(wù)器請求下載某些文件根欧,無論是客戶端還是服務(wù)器都沒有必要紀錄彼此過去的行為怜珍,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關(guān)系一樣凤粗,你認得它們酥泛,它們則肯定認不得你。
當一個用戶在請求一個頁面后在請求另外一個頁面時嫌拣,http將無法告訴我們這兩個請求是來自同一個變量柔袁。
會話控制思想就是能夠在網(wǎng)站中跟蹤一個變量,我們可以跟蹤變量异逐,就可以做到對用戶的支持捶索,并根據(jù)授權(quán)和用戶身份顯示不同內(nèi)容,不同頁面灰瞻。
Cookie和 session有什么用腥例?
常見的用法,比如在有些網(wǎng)站下載東西需要會員先登陸酝润。http協(xié)議本身是無狀態(tài)的燎竖,無法得知顧客是否已經(jīng)登陸,怎么辦呢要销?cookie和session就可以知道构回。再比如網(wǎng)上購物,購物車怎么知道顧客挑選過哪些商品呢蕉陋?cookie和session也可以記錄捐凭。總而言之凳鬓,cookie和session就是能夠記錄顧客狀態(tài)的技術(shù)茁肠,盡管二者屬于不同的技術(shù),但只要cookie能做到的缩举,session也能做到垦梆!
11.4.2基本會話功能
php的會話是通過會話ID來實現(xiàn), 用戶在每次登陸的過程中仅孩,得到會話ID是唯一的托猩,它可以保存在用戶的機器里,或者通過URL在網(wǎng)絡(luò)上傳輸辽慕。
會話ID像一把鑰匙京腥,他允許我們注冊特定的變量,我們稱為會話變量溅蛉。
這些變量的內(nèi)容保存在服務(wù)器端公浪,而會話ID就是客戶端唯一可見的信息他宛,如果在網(wǎng)絡(luò)連接中,客戶端通過COOKIE或URL確定了會話的ID欠气,那么就可以訪問厅各,會話保存在服務(wù)器上的會話變量。
11.4.3 Cookie和Session在php中的使用
cookie和session都可以暫時保存在多個頁面中使用的變量预柒。但是它們有本質(zhì)的差別队塘。
cookie存放在客戶端瀏覽器中,session保存在服務(wù)器上宜鸯。它們之間的聯(lián)系是session ID 一般保存在cookie中.
在WEB技術(shù)發(fā)展史上憔古,Cookie技術(shù)的出現(xiàn)是一個重大的變革。
最先是Netscape在它的Netscape Navigator瀏覽器中引入了Cookie 技術(shù)顾翼,從那時起投放,World Wide Web 協(xié)會就開始支持Cookie標準奈泪。以后又經(jīng)過微軟的大力推廣,即在微軟的 Internet Explorer 瀏覽器中完全支持Cookie技術(shù)适贸。到現(xiàn)在,絕大多數(shù)的瀏覽器都支持Cookie技術(shù)涝桅,或者至少兼容Cookie技術(shù)的使用拜姿。
11.4.4 Cookie
1. 什么是Cookie?
cookie是在http協(xié)議下冯遂,服務(wù)器或腳本可以維護客戶端信息的一種方式蕊肥。
cookie是web服務(wù)器保存在用戶瀏覽器上的小甜餅(文件),她可以包含有關(guān)用戶的信息。當用戶訪問服務(wù)器時,服務(wù)器可以訪問到cookie的信息
如果瀏覽器上Cookie太多蛤肌,超過了系統(tǒng)所允許的范圍壁却,瀏覽器將自動對它進行刪除。
2. Cookie工作原理
當客戶訪問某個基于PHP技術(shù)的網(wǎng)站時裸准,在PHP中可以使用setcookie函數(shù)生成一個cookie展东,系統(tǒng)經(jīng)處理把這個cookie發(fā)送到客戶端并保存在C:\Documents and Settings\用戶名\Cookies目錄下。cookie是 HTTP標頭的一部分, 因此setcookie函數(shù)必須在任何內(nèi)容送到瀏覽器之前調(diào)用炒俱。這種限制與header()函數(shù)一樣(如需了解head()函數(shù)盐肃,請自行查閱)。當客戶再次訪問該網(wǎng)站時权悟,瀏覽器會自動把C:\Documents and Settings\用戶名\Cookies目錄下與該站點對應(yīng)的cookie發(fā)送到服務(wù)器砸王,服務(wù)器則把從客戶端傳來的cookie將自動地轉(zhuǎn)化成一個PHP變量。在PHP5中峦阁,客戶端發(fā)來的cookie將被轉(zhuǎn)換成全局變量谦铃。你可以通過$_COOKIE[‘xxx’]讀取。
3. 設(shè)置Cookie
PHP用setcookie函數(shù)來設(shè)置Cookie榔昔。Cookie 在傳輸過程中驹闰,是HTTP 協(xié)議頭的一部分凿跳,用于瀏覽器和服務(wù)器之間傳遞信息,所以必須在任何屬于HTML文件本身的內(nèi)容輸出之前調(diào)用SetCookie函數(shù),調(diào)用該函數(shù)前即使有空格疮方、空白行都不行
setcookie函數(shù)定義了一個cookie并且把它附加在http頭中:
int setcookie(string name,[string value,[int expire,[string path,[string domain,[int secure]]]]]);
常用參數(shù)解釋:
name參數(shù)是設(shè)置cookie的名字.
value設(shè)定了cookie的值.
expire參數(shù)是一個標準的Unix時間標記控嗜,可以用time()函數(shù)取得,以秒為單位:
可選參數(shù)path, domain,secure
path :服務(wù)器端的有效路徑
domain :設(shè)定有效域名
secure :設(shè)置是否僅在https安全連接時才設(shè)定
注意:
如果網(wǎng)站有幾個不同的文件目錄骡显,使用不帶路徑的cookie疆栏,那么在一個頁面里設(shè)置的cookie在另一個頁面里會看不到.如果沒有指定路徑,web服務(wù)器自動把設(shè)置時的路徑作為指定的路徑惫谤。
解決辦法:設(shè)定路徑和域名比如: www.php.net
實例: $value="the best way is by yourself";
setcookie("cookiename",$value,time()+60*60*24*7);
接收和處理cookie
PHP對cookie有很好的支持壁顶,和form表單一樣,在接收的時候PHP會自動從web服務(wù)器接收HTTP頭并且分析它溜歪。接收的時候和表單接收一樣若专,用聯(lián)COOKIE[ ]或者$_HTTP_COOKIE_VARS[ ]接收。
cookie的生命周期到了蝴猪,cookie就會失效
設(shè)置一個cookie時失效時間為time( )那么在頁面瀏覽完之后就被刪除
4. 使用Cookie的限制
首先:在html文件的內(nèi)容輸出前設(shè)置:
不同的瀏覽器版本调衰,瀏覽器型號對cookie的處理不同
客戶端可以禁用cookie,瀏覽器也會限制cookie的數(shù)量
5. 創(chuàng)建Cookie數(shù)組
其一: SetCookie("CookieArray[]", "Value 1"); SetCookie("CookieArray[]", "Value 2"); 其二: SetCookie("CookieArray[0]", "Value 1"); SetCookie("CookieArray[1]", "Value 2");
setcookie()中使用數(shù)組的例子:
<?php????? setcookie("cookie[three]", "cookiethree");????? setcookie("cookie[two]", "cookietwo");????? setcookie("cookie[one]", "cookieone");//刷新頁面后自阱,顯示出來????? if (isset($_COOKIE['cookie'])) {????????? ?foreach ($_COOKIE['cookie'] as $name => $value) {??????????????? echo "$name : $value <br />\n";}????? } //help from php_help ?>
6. 刪除Cookie
要刪除一個已經(jīng)存在的Cookie嚎莉,有兩個辦法: 1、調(diào)用只帶有name參數(shù)的SetCookie沛豌,那么名為這個name的Cookie將被從關(guān)系戶機上刪掉趋箩;setcookie(“MyCookie”); //刪除MyCookie。
2加派、設(shè)置Cookie的失效時間為time()或time()-1//time()減多少沒有關(guān)系啦叫确,只要是過期時間就行//,那么這個Cookie在這個頁面的瀏覽完之后就被刪除了(其實是失效了)芍锦。
例如:setcookie(“MyCookie”,”Value”,time()-1); //刪除MyCookie竹勉。要注意的是,當一個Cookie被刪除時醉旦,它的值在當前頁在仍然有效的饶米。如果要把cookie保存為瀏覽器進程,即瀏覽器關(guān)閉后就失效车胡。那么可以直接把expiretime設(shè)為0檬输。例如:setcookie(“name”,”value”,0)。該參數(shù)不設(shè)置的話匈棘,關(guān)閉瀏覽器也能結(jié)束一個cookie丧慈。
7. Cookie注意事項
1、SetCookie()之前不能有任何html輸出,就是空格逃默,空白行都不行鹃愤。
2、SetCookie()后完域,你在當前頁調(diào)用echo $_COOKIE[“name”]不會有輸出软吐。必須刷新或到下一個頁面才可以看到Cookie值。
3吟税、使用Cookie的限制凹耙。一個瀏覽器能創(chuàng)建的Cookie數(shù)量最多為30個,并且每個不能超過4KB肠仪,每個WEB站點能設(shè)置的Cookie總數(shù)不能超過20個肖抱。
4、Cookie是保存在客戶端的异旧,用戶禁用了Cookie意述,你的Cookie自然也就沒作用啦!
11.4.5 Session
1. 什么是Session吮蛹?
session在web開發(fā)中具有非常重要的份量荤崇。它可以將用戶正確登錄后的信息記錄到服務(wù)器的內(nèi)存中,當用戶以此身份訪問網(wǎng)站的管理后臺時匹涮,無需再次登錄即可得到身份確認天试。而沒有正確登錄的用戶則不分配session空間槐壳,即便輸入了管理后臺的訪問地址也不能看到頁面內(nèi)容然低。通過session確定了用戶對頁面的操作權(quán)限。
2. Session的原理
當用戶向服務(wù)器端發(fā)送了一個開啟了session的url請求务唐,服務(wù)器會因為該請求開啟了session雳攘,而為這次請求隨機分配一個sessionid。同時服務(wù)器端的指定路徑下枫笛,會記錄該sessionid吨灭,以及該用戶的登錄信息(例如用戶名和密碼)。同時會將這個sessionid傳回發(fā)送請求的客戶端刑巧,而這個sessionid會被保存在客戶端一個生命周期為0的cookie中喧兄。因此session的正常使用要依賴于cookie的開啟。
注:
因為cookie是通過客戶端瀏覽器來保存的啊楚,在ie瀏覽器中吠冤,如果瀏覽器的隱私設(shè)置為阻止所有cookie,那么cookie則被禁用恭理,而session也不能正常使用拯辙。如果想讓session正常發(fā)揮作用,瀏覽器隱私需要設(shè)置為高或者以下颜价。
3. Session的使用步驟
1). 啟動session:使用session_start()函數(shù)來啟動涯保。
2). 注冊會話:直接給$_SESSION數(shù)組添加元素即可诉濒。
3). 使用會話:判斷session是否為空或者是否已經(jīng)注冊,如果已經(jīng)存在則像普通數(shù)組使用即可夕春。
4). 刪除會話:
A. 可以使用unset刪除單個session未荒;
B. 使用$_SESSION=array()的方式,一次注銷所有的會話變量及志;
C. 使用session_destroy()函數(shù)來徹底銷毀session茄猫。
4. 對刪除會話的三種方式比較
A. unset可以將session值從session文件中清除,但是該session文件依然存在困肩;在同一個頁面划纽,unset一個session值后,立刻輸出該session值锌畸,無法獲得內(nèi)容勇劣。
B. $_SESSION=array()的方式也是將session值從session文件中清除,但是該session文件依然存在潭枣;在同一個頁面比默,通過$_SESSION=array()刪除所有session后,立刻輸出session值盆犁,無法獲得內(nèi)容命咐。
C. session_destroy()可以將session的保存文件進行刪除。在同一個頁面谐岁,session_destroy()銷毀session后醋奠,立刻輸出該session值,還依然可以輸出session的內(nèi)容伊佃,當刷新后則無法獲得內(nèi)容窜司。
因此,為了徹底清除session航揉,一般先$_SESSION=array()塞祈,然后再session_destroy()。
5. Session的綜合應(yīng)用
當用戶登錄成功后帅涂,必須應(yīng)用Session技術(shù)來跟蹤登錄信息议薪。此外需要同時將驗證碼圖片生成進行復(fù)習(xí)。因為驗證碼圖片生成過程中利用到了Session技術(shù)的跨頁面?zhèn)髦档奶匦浴?/p>
11.4.6 Session和Cookie的區(qū)別
cookie是保存在客戶端機器的媳友,對于未設(shè)置過期時間的cookie斯议,cookie值會保存在機器的內(nèi)存中,只要關(guān)閉瀏覽器則cookie自動消失庆锦。如果設(shè)置了cookie的過期時間捅位,那么瀏覽器會把cookie以文本文件的形式保存到硬盤中,當再次打開瀏覽器時cookie值依然有效。
session是把用戶需要存儲的信息保存在服務(wù)器端艇搀。每個用戶的session信息就像是鍵值對一樣存儲在服務(wù)器端尿扯,其中的鍵就是sessionid,而值就是用戶需要存儲信息焰雕。服務(wù)器就是通過sessionid來區(qū)分存儲的session信息是哪個用戶的衷笋。
Session和Cookie兩者最大的區(qū)別就是session存儲在服務(wù)器端,而cookie是在客戶端矩屁。session安全性更高辟宗,而cookie安全性弱。
11.5知識運用
根據(jù)本講單元講述的內(nèi)容吝秕,做出一個標準的用戶注冊登錄的模塊泊脐。包括標準的注冊表單書寫、表單信息入庫烁峭。當注冊成功后容客,可以通過登錄界面進入到會員管理中心。如果是首次注冊成功约郁,那么默認同時讓該用戶進入會員中心缩挑。因為這個涉及到我們下個月所學(xué)內(nèi)容,所以本單元側(cè)重于用戶登錄模塊鬓梅,而登錄成功后只需要先應(yīng)用session技術(shù)供置,然后進入到一個模擬會員中心的頁面即可。