应该是比去年更早的时候写的今天看的时候居然有些懵逼的感觉,这该就是平时的框架用习惯了,让我忘记了真正的代码怎么写了吧。说的对我们不应该把时间用在造轮子上面,可是不觉得只是会把一块块别人的东西搬来搬去的,都不知道里面是什么,这种不求甚解的态度更是显得傻乎乎吗?
其中code.php就是验证码,但为什么它放在图片的文件夹中,因为php可以输出为多种格式,包括html,png等,所以只需要将其看成是png格式就好了。总体的思想是:
1.创建一张图片
2.将其用颜色填充,即为该验证码的背景图片。
3.随机的在图片上随机位置用随机的颜色画写线条和星号作为混淆。
4.将预先存储在session中的字符逐个在图片的某个范围内随机的写上。
这样一张验证码的图片就生成了。代码如下:
session_start();
$len = 4;
/*创建一张图片*/
$_width = 75;
$_height = 25;
$_img = imagecreatetruecolor($_width,$_height);//创建一张真彩色图片
header('Content-type:image/png');//要交代一下图片的格式
/*创建颜色 */
$_white = imagecolorallocate($_img,255,255,255);//白色
$_black = imagecolorallocate($_img,0,0,0);//黑色
$rnd_cor = imagecolorallocate($_img,mt_rand(150,225),mt_rand(150,225),mt_rand(150,225));//较浅的随机色
$rnd_cor1 = imagecolorallocate($_img,mt_rand(30,180),mt_rand(30,180),mt_rand(30,180));//较深的随即色
imagefill($_img,0,0,$_white);//用白色填充图片;;
for($i = 0; $i < 10; $i++){
imageline($_img,mt_rand(0,$_width),mt_rand(0,$_height),mt_rand(0,$_width),mt_rand(0,$_height),$rnd_cor);//随机画出一条颜色较浅的随机线条;;
}
for($i = 0; $i < 100;$i++){
imagestring($_img,2,mt_rand(0,$_width),mt_rand(0,$_height),'*',$rnd_cor);
}
for($i = 0; $i < $len; $i++){
imagestring($_img,6,$i*$_width/$len+mt_rand(1,10),mt_rand(1,$_height/2),$_SESSION['code'][$i],$rnd_cor1);
}
//imagerectangle($_img,0,0,$_width-1,$_height-1,$_black);//给图片添加黑色的边框;
imagepng($_img);//将这张真彩色图片输出;
imagedestroy($_img);//销毁图像的句柄;
上面的步骤是生成一张验证码图片,那怎样使用起来呢?
这是使用的js代码,实现点击切换验证码,点击的时候把这张图片的src 重新赋给它,只是后面加上了一个随机数。
给要请求的资源路径后面加上问号和随机数数,就不会使用浏览器中的缓存,而是重新向服务器请求。
那如果在此之前将session中的内容进行修改,验证码中的内容有时读取的session中的,那我们岂不是得到了一张新的验证码。而且此时验证码已然存在session中,我们想在那里进行验证都是可以的。
/*实现 点击验证码实现自动切换的功能*/
$("#code").click(function(){
$.post(ciev,null,function(data){
cheCode = data;
$("#code").get(0).src = "code.php?tm"+Math.random();
},'json');