最近在学习前端js时,学习到了如何生成验证码图片,觉得有点神奇(我现在可能觉得什么都很神奇),所以在这里总结 记录一下。
生成图片的后台PHP代码:(命名为 code.php)
<?php
session_start();
getCode(4,60,20);
function getCode($num,$w,$h){ //位数,宽,高
$data='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789';
$code="";
for($i=0; $i<$num; $i++){
$code.=substr($data,rand(0,strlen($data)-1),1);
}
//4位验证码也可以用rand(1000,9999)直接生成
//将生成的验证码写入session,备验证时用
$_SESSION["code"]=$code; //保存在SESSION的code中
//创建图片,定义颜色值
header("Content-type: image/PNG");
$im=imagecreate($w,$h);
$black=imagecolorallocate($im, 0, 0, 0);
$gray=imagecolorallocate($im, 200, 200, 200);
$bgcolor=imagecolorallocate($im, 255, 255, 255);
//填充背景
imagefill($im, 0, 0, $gray);
//画边框
imagerectangle($im, 0, 0, $w-1, $h-1, $black);
//在画布上随机生成大量黑点,起干扰作用
for($i=0; $i<80; $i++){
imagesetpixel($im, rand(0, $w), rand(0, $h), $black);
}
//将数字随机显示在画布上,字符的水平间距和位置都按一定波动范围随机生成
$strx=rand(3,8);
for($i=0; $i<$num; $i++){
$strpos=rand(1,6);
imagestring($im, 5, $strx, $strpos, substr($code, $i, 1), $black);
$strx+=rand(8,12);
}
imagepng($im); //输出图片
imagedestroy($im); //水房图片所占内存
}
?>
用于验证的后台PHP代码:(命名为 check_code.php)
<?php
session_start(); //打开session
header("Content-Type:text/plain");
//接收从客户端发来的code
@$code=$_REQUEST["code"];
//用客户端的code和session中保存好的code比较
if(strtolower($code)==strtolower($_SESSION["code"])) //strtolower为php中转换为小写函数
echo "true";
else
echo "false";
?>
前台js代码
<style>
.ok{color:green}
.err{color:red}
</style>
<body>
验证码:<input id="txtCode" />
<img src="code.php" />
<br>
<sapn id="msgCode"></span>
<script>
document.getElementById("txtCode").onkeyup=function(){
if(document.getElementById("txtCode").value !=""){
//AJAX 1、获取xhr
if(window.XMLHttpRequest){
var xhr=new XMLHttpRequest();
}else{
var xhr=new ActiveXObject("Microsoft.XMLHttp");
}
//2、创建请求
xhr.open("get","check_code.php?code="+document.getElementById("txtCode").value,true);
//3、设置回调函数
xhr.onreadystatechange=function(){
if(xhr.readyState==4 && xhr.status==200){
var data=xhr.responseText;
if(data=="true"){
msgCode.innerHTML="验证码正确";
msgCode.className="ok";
}else{
msgCode.innerHTML="验证码错误";
msgCode.className="err";
}
}
}
//4、发送请求
xhr.send();
}else{msgCode.innerHTML="";}
}
</script>
</body>