登录页面动态验证码的设置

时间:2021-05-26 17:09:14

登录页面动态验证码的设置

采用php中创建对象的思想进行动态验证码的设置

1、创建出一个背景图片,用来存放动态码输出位置

 1       function createImage(){
2 // 创建图片对象,并设置图片的宽高 imagecreatetruecolor
3 $this->image = imagecreatetruecolor($this->width, $this->height);
4 // 图片创建背景颜色
5 // rand(下界,上界), php中的随机数
6 $backgroundColor = imagecolorallocate($this->image, rand(225,255), rand(225, 255), rand(225,255));
7 // 填充背景颜色
8 imagefill($this->image, 0, 0, $backgroundColor);
9 // 给验证码设置边框
10 $borderColor = imagecolorallocate($this->image, 0, 0 , 0); // 黑色边框
11 // 绘制边框
12 imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $borderColor);
13 }

2、设置动态码中的干扰信息,可以为(点, 线·······)

 

function setDisturbElement(){
// 随机生成干扰项的数量
$lineNumbers = rand(2, 4);
// 通过for循环循环生成每个干扰线
for ($i=0; $i < $lineNumbers; $i++) {
// 左上角到右下角
$x1 = rand(2, $this->width / 2);
$y1 = rand(2, $this->height / 2);
$x2 = rand($this->width/2, $this->width-2);
$y2 = rand($this->height/2, $this->height-2);
$color = imagecolorallocate($this->image, rand(100, 200), rand(100, 200), rand(100, 200));
// 绘制线条
imageline($this->image, $x1, $y1, $x2, $y2, $color);
}
}

 

 

 

 

3、生成验证码字符串中的字符串信息,并将其存储到本地的session中以便于信息的验证

 

 1 private function createCheckingCode(){
2 $code = "0123456789qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDASZXCVBNM";
3 // echo $code;
4 // 接受验证码的字符串
5 $string = '';
6 for ($i=0; $i < $this->codeNumbers; $i++) {
7 $index = rand(0, (strlen($code) - 1));
8 // echo $index;
9 $string .= substr($code, $index, 1); // 获取code字符串的下标为$index的字符,添加到String字符串中
10 }
11 return $string;
12 }
13 // 为图像设置验证码文本
14 function setValidationCode(){
15 for ($i=0; $i < $this->codeNumbers; $i++) {
16 $x = rand(1, 4) + $this->width * $i / $this->codeNumbers;
17 $y = rand(1, $this->height/4);
18 $color= imagecolorallocate($this->image, rand(0,128), rand(0, 128), rand(0, 128));
19 $fontSize = rand(6, 8);
20 // 绘制文本
21 imagestring($this->image,$fontSize, $x, $y, $this->checkingCode[$i], $color);
22 }
23 }
24 // 存储验证码到session中
25 function saveVcodeToSession(){
26 include_once('session.php');
27 $session = new Session();
28 $session->set('checkingCode', $this->checkingCode, 10);
29 }

 

 

 

 

 

4、对生成的验证码进行前端输出

 

1 function outputImage(){
2 $this->createImage(); // 绘制图片
3 $this->setDisturbElement(); // 绘制线条
4 $this->setValidationCode(); // 生成文本
5 header("Content-Type:image/png"); // 设置文档输出类型, png类型 | jpg
6 imagepng($this->image);
7 }

 

 

完整代码

 

登录页面动态验证码的设置登录页面动态验证码的设置
 1 <?php
2 // 要将验证码的码值保存在session,方便前端进行比对验证
3 session_start();
4 /**
5 * 验证码生成类
6 */
7 class Validationcode
8 {
9 // private ,私有成员,只限于内部使用
10 private $width;
11 private $height;
12 private $codeNumbers; // 验证码的个数
13 private $image; // 将来要输出的图像
14 private $checkingCode; // 验证码字符串,将被保存在session数组中
15 function __construct($width = 80, $height = 30, $codeNumbers = 4) // 如果不提供参数,则80, 30, 4 为默认值
16 {
17 $this->width = $width;
18 $this->height = $height;
19 $this->codeNumbers = $codeNumbers;
20 $this->checkingCode = $this->createCheckingCode(); // 随机生成验证码
21 // echo $this->checkingCode;
22 }
23 // 创建背景图片函数
24 function createImage(){
25 // 创建图片对象,并设置图片的宽高 imagecreatetruecolor
26 $this->image = imagecreatetruecolor($this->width, $this->height);
27 // 图片创建背景颜色
28 // rand(下界,上界), php中的随机数
29 $backgroundColor = imagecolorallocate($this->image, rand(225,255), rand(225, 255), rand(225,255));
30 // 填充背景颜色
31 imagefill($this->image, 0, 0, $backgroundColor);
32 // 给验证码设置边框
33 $borderColor = imagecolorallocate($this->image, 0, 0 , 0); // 黑色边框
34 // 绘制边框
35 imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $borderColor);
36 }
37 // 设置干扰项
38 function setDisturbElement(){
39 // 随机生成干扰项的数量
40 $lineNumbers = rand(2, 4);
41 // 通过for循环循环生成每个干扰线
42 for ($i=0; $i < $lineNumbers; $i++) {
43 // 左上角到右下角
44 $x1 = rand(2, $this->width / 2);
45 $y1 = rand(2, $this->height / 2);
46 $x2 = rand($this->width/2, $this->width-2);
47 $y2 = rand($this->height/2, $this->height-2);
48 $color = imagecolorallocate($this->image, rand(100, 200), rand(100, 200), rand(100, 200));
49 // 绘制线条
50 imageline($this->image, $x1, $y1, $x2, $y2, $color);
51 }
52 }
53 // 对创建的验证码图片进行输出
54 function outputImage(){
55 $this->createImage(); // 绘制图片
56 $this->setDisturbElement(); // 绘制线条
57 $this->setValidationCode(); // 生成文本
58 header("Content-Type:image/png"); // 设置文档输出类型, png类型 | jpg
59 imagepng($this->image);
60 }
61 // 生成验证码字符串
62 // 私有的函数
63 private function createCheckingCode(){
64 $code = "0123456789qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDASZXCVBNM";
65 // echo $code;
66 // 接受验证码的字符串
67 $string = '';
68 for ($i=0; $i < $this->codeNumbers; $i++) {
69 $index = rand(0, (strlen($code) - 1));
70 // echo $index;
71 $string .= substr($code, $index, 1); // 获取code字符串的下标为$index的字符,添加到String字符串中
72 }
73 return $string;
74 }
75 // 为图像设置验证码文本
76 function setValidationCode(){
77 for ($i=0; $i < $this->codeNumbers; $i++) {
78 $x = rand(1, 4) + $this->width * $i / $this->codeNumbers;
79 $y = rand(1, $this->height/4);
80 $color= imagecolorallocate($this->image, rand(0,128), rand(0, 128), rand(0, 128));
81 $fontSize = rand(6, 8);
82 // 绘制文本
83 imagestring($this->image,$fontSize, $x, $y, $this->checkingCode[$i], $color);
84 }
85 }
86 // 存储验证码到session中
87 function saveVcodeToSession(){
88 include_once('session.php');
89 $session = new Session();
90 $session->set('checkingCode', $this->checkingCode, 10);
91 }
92 }
93 $vcode = new Validationcode();
94 $vcode->outputImage();
95 $vcode->saveVcodeToSession();
96 ?>
php