《PHP學(xué)習(xí):PHP+Ajax實(shí)現(xiàn)驗(yàn)證碼的實(shí)時(shí)驗(yàn)證》要點(diǎn):
本文介紹了PHP學(xué)習(xí):PHP+Ajax實(shí)現(xiàn)驗(yàn)證碼的實(shí)時(shí)驗(yàn)證,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
PHP的圖像處理功能強(qiáng)大,做一張驗(yàn)證碼圖片也是非常簡(jiǎn)單的,但是,在實(shí)現(xiàn)實(shí)時(shí)驗(yàn)證時(shí),確遇到了一個(gè)難題:
我用nat123對(duì)我的電腦上的網(wǎng)站進(jìn)行端口映射,實(shí)現(xiàn)了在外網(wǎng)訪(fǎng)問(wèn),本來(lái)是采用cookie的方式用js對(duì)驗(yàn)證碼進(jìn)行驗(yàn)證,但是經(jīng)檢驗(yàn)發(fā)現(xiàn)nat123雖然使我的網(wǎng)站可以通過(guò)一個(gè)自定義的網(wǎng)址進(jìn)行訪(fǎng)問(wèn),但是產(chǎn)生驗(yàn)證碼的php文件在網(wǎng)絡(luò)上的位置竟然和其它頁(yè)面不在一個(gè)域,經(jīng)查詢(xún)得知,因?yàn)檩敵鰣D片的緣故,被作為緩存文件映射在了某個(gè)文件夾內(nèi),所以――其他頁(yè)面在我的網(wǎng)址下,產(chǎn)生驗(yàn)證碼的頁(yè)面又在另一個(gè)網(wǎng)址里,所以它們的cookie不能共用,不管怎么設(shè)置path和domain都不管用,于是我只好采用session存儲(chǔ)驗(yàn)證碼了,因?yàn)閟ession存在于服務(wù)器,也就是在我本地網(wǎng)址中都可以存取.
接下來(lái)是重頭戲,之前只是粗略了解過(guò)ajax,對(duì)于它的用途和特性還是知道的,獲取后臺(tái)來(lái)的數(shù)據(jù)這個(gè)比較泛泛的概念具體的使用起來(lái)就不知道如何下手了.
首先,我分析了個(gè)例題的代碼,用途是獲取后臺(tái)的一個(gè)文本文件的內(nèi)容:PHP學(xué)習(xí)
function getHTTPObject(){ if(typedef XMLHttpRequest == "undefined") XMLHttpRequest = function(){ try{ return new ActiveXObject("Msxml2.XMLHTTP.6.0");} catch(e){} try{ return new ActiveXObject("Msxml2.XMLHTTP.3.0");} catch(e){} try{ return new ActiveXObject("Msxml2.XMLHTTP");} catch(e){} return false; } return new XMLHttpRequest(); } function getNewContent(){ var request = getHTTPObject(); if(request){ request.open("GET","TEST.txt",true); request.onreadystateschange = function(){ alert(request.responseText); } }else{ alert("no support XMLHttpRequest!"); } }
其中的關(guān)鍵是:PHP學(xué)習(xí)
request.open("GET","TEST.txt",true); request.onreadystateschange =function(){ alert(request.responseText); }
這三句指定了GET請(qǐng)求發(fā)向的頁(yè)面和XMLHttpRequest對(duì)象送回響應(yīng)的時(shí)候觸發(fā)的處理函數(shù),而數(shù)據(jù)正是通過(guò)request.responseText獲取的.PHP學(xué)習(xí)
--------------------------------------------------------------------------------PHP學(xué)習(xí)
可是我要獲取的數(shù)據(jù)是后臺(tái)php文件產(chǎn)生的驗(yàn)證碼,怎么讓后臺(tái)發(fā)送驗(yàn)證碼?
無(wú)論GET還是POST方式都是把數(shù)據(jù)發(fā)送到后臺(tái),ajax從哪里取回后臺(tái)的數(shù)據(jù)呢?
百思不得其解之下,我又查詢(xún)了另一本資料,找到一個(gè)示例:
其中XMLHttpRequest對(duì)象送回響應(yīng)的處理語(yǔ)句是:PHP學(xué)習(xí)
request.onreadystateschange=alertContent; function alertContent(){ ... alert(request.responseText); ... }
請(qǐng)求的文件為check.php
其中有這么幾句條件輸出:PHP學(xué)習(xí)
if($info){ echo "你的用戶(hù)名可以使用"; }else { echo "該用戶(hù)名已被注冊(cè)"; }
而運(yùn)行實(shí)例效果圖中赫然在靜態(tài)頁(yè)面彈出消息框,內(nèi)容如check.php頁(yè)面的輸出!!!
也就是說(shuō)ajax能請(qǐng)求到一個(gè)php頁(yè)面的輸出內(nèi)容,于是,接下來(lái)簡(jiǎn)單多了,因?yàn)閳D片也是驗(yàn)證碼頁(yè)面的輸出,所以不能直接ajax驗(yàn)證碼頁(yè)面,不然就把圖片的數(shù)據(jù)也獲取了.
新建一個(gè)php頁(yè)面:PHP學(xué)習(xí)
sission_start(); $code=""; if(!empty($_session['check']))$code=$_session['check']; echo $code;
再在前端用ajax向這個(gè)頁(yè)面GET一個(gè)請(qǐng)求,就能用request.responseText獲取驗(yàn)證碼了.
然后把驗(yàn)證過(guò)程封裝在一定條件觸發(fā)的函數(shù)里,即可實(shí)時(shí)驗(yàn)證.
PHP學(xué)習(xí)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持維易PHP.PHP學(xué)習(xí)
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/5118.html