Ajax 和 PHP 实现验证码的实时验证
我的个人博客:逐步前行STEP
PHP的图像处理功能强大,做一张验证码图片也是非常简单的,但是,在实现实时验证时,确遇到了一个难题:
我用nat123对我的电脑上的网站进行端口映射,实现了在外网访问,本来是采用cookie的方式用js对验证码进行验证,但是经检验发现nat123虽然使我的网站可以通过一个自定义的网址进行访问,但是产生验证码的php文件在网络上的位置竟然和其它页面不在一个域,经查询得知,因为输出图片的缘故,被作为缓存文件映射在了某个文件夹内,所以——其他页面在我的网址下,产生验证码的页面又在另一个网址里,所以它们的cookie不能共用,不管怎么设置path和domain都不管用,于是我只好采用session存储验证码了,因为session存在于服务器,也就是在我本地网址中都可以存取。
接下来是重头戏,之前只是粗略了解过ajax,对于它的用途和特性还是知道的,获取后台来的数据这个比较泛泛的概念具体的使用起来就不知道如何下手了。
首先,我分析了个例题的代码,用途是获取后台的一个文本文件的内容:
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!");
}
}
其中的关键是:
request.open("GET","TEST.txt",true);
request.onreadystateschange =function(){
alert(request.responseText);
}
这三句指定了GET请求发向的页面和XMLHttpRequest
对象送回响应的时候触发的处理函数,而数据正是通过request.responseText
获取的。
可是我要获取的数据是后台php文件产生的验证码,怎么让后台发送验证码?
无论GET还是POST方式都是把数据发送到后台,ajax从哪里取回后台的数据呢?
百思不得其解之下,我又查询了另一本资料,找到一个示例:
其中XMLHttpRequest对象送回响应的处理语句是:
request.onreadystateschange=alertContent;
function alertContent(){
...
alert(request.responseText);
...
}
请求的文件为check.php
其中有这么几句条件输出:
if($info){
echo "你的用户名可以使用";
}else {
echo "该用户名已被注册";
}
而运行实例效果图中赫然在静态页面弹出消息框,内容如check.php页面的输出!!!
也就是说ajax能请求到一个php页面的输出内容,于是,接下来简单多了,因为图片也是验证码页面的输出,所以不能直接ajax验证码页面,不然就把图片的数据也获取了。
新建一个php页面:
sission_start();
$code="";
if(!empty($_session['check']))$code=$_session['check'];
echo $code;
再在前端用ajax向这个页面GET一个请求,就能用request.responseText
获取验证码了。
然后把验证过程封装在一定条件触发的函数里,即可实时验证。