zoukankan      html  css  js  c++  java
  • php验证码的制作

      1 <?php
      2   class Vcode {
      3     private $width;    //
      4     private $height;   //
      5     private $num;    //数量
      6     private $code;    //验证码
      7     private $img;     //图像的资源
      8     function __construct($width=120, $height=30, $num=4) {
      9       $this->width = $width;
     10       $this->height = $height;
     11       $this->num = $num;
     12       $this->code = $this->createcode(); 
     13     }
     14     //获取字符的验证码, 用于保存在服务器中
     15     function getcode() {
     16       return $this->code;
     17     }
     18     //输出图像
     19     function outimg() {
     20       //创建背景 (颜色, 大小, 边框)
     21       $this->createback();
     22       //画字 (大小, 字体颜色)
     23       $this->outstring();
     24       //干扰元素(点, 线条)
     25       $this->setdisturbcolor();
     26       //输出图像
     27       $this->printimg();
     28     }
     29     //创建背景
     30     private function createback() {
     31       //创建资源
     32       $this->img = imagecreatetruecolor($this->width, $this->height);
     33       //设置随机的背景颜色
     34       $bgcolor =  imagecolorallocate($this->img, rand(225, 255), rand(225, 255), rand(225, 255)); 
     35       //设置背景填充
     36       imagefill($this->img, 0, 0, $bgcolor);
     37       //画边框
     38       $bordercolor =  imagecolorallocate($this->img, 0, 0, 0);
     39        imagerectangle($this->img, 0, 0, $this->width-1, $this->height-1, $bordercolor);
     40     }
     41 
     42     //画字
     43     private function outstring() {
     44       for($i=0; $i<$this->num; $i++) {
     45         $color= imagecolorallocate($this->img, rand(0, 128), rand(0, 128), rand(0, 128)); 
     46         $fontsize=rand(10,12);  //字体大小
     47         $x = 3+($this->width/$this->num)*$i; //水平位置
     48         $y = rand(0, imagefontheight($fontsize)-3);
     49         //画出每个字符
     50         imagechar($this->img, $fontsize, $x, $y, $this->code{$i}, $color);
     51       }
     52     }
     53 
     54     //设置干扰元素
     55     private function setdisturbcolor() {
     56       //加上点数
     57       for($i=0; $i<100; $i++) {
     58         $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 255), rand(0, 255)); 
     59            //给验证码图片干扰点上色
     60         imagesetpixel($this->img, rand(1, $this->width-2), rand(1, $this->height-2), $color);
     61         //用color颜色在x,y坐标上画一个点
     62       }
     63 
     64       //加线条
     65       for($i=0; $i<5; $i++) {
     66         $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 128), rand(0, 255)); 
     67         //给验证码图片干扰弧线上色
     68         imagearc($this->img,rand(-10, $this->width+10), rand(-10, $this->height+10), rand(30, 300), rand(30, 300), 55,44, $color);
     69         //画弧线
     70       }
     71     }
     72 
     73     //输出图像
     74     private function printimg() {
     75       if (imagetypes() & IMG_GIF) {
     76            header("Content-type: image/gif");
     77             imagegif($this->img);
     78       } elseif (function_exists("imagejpeg")) {
     79            header("Content-type: image/jpeg");
     80            imagejpeg($this->img);
     81       } elseif (imagetypes() & IMG_PNG) {
     82            header("Content-type: image/png");
     83             imagepng($this->img);
     84       }  else {
     85             die("No image support in this PHP server");
     86       } 
     87     
     88     }
     89 
     90     //生成验证码字符串
     91     private function createcode() {
     92       $codes = "3456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY";
     93       // 去掉容易混淆的字符0oil012
     94       $code = "";
     95       for($i=0; $i < $this->num; $i++) {
     96         $code .=$codes{rand(0, strlen($codes)-1)};//rand()函数返回code字符串中任意一个位置  
     97       }
     98       return $code;
     99     }
    100 
    101     //用于自动销毁图像资源
    102     function __destruct() {
    103       imagedestroy($this->img);
    104     }
    105 
    106   }
    107 ?>

    生成验证码的效果如图所示,上面所示代码的文件名为vcode.class.php;我们在code.php文件中开启session,引用这个文件;

    代码如下:

    <?php
        //开启session
        session_start();
        include "vcode.class.php";
        //构造方法
        $vcode = new Vcode();
        //将验证码放到服务器自己的空间保存一份
        $_SESSION['code'] = $vcode->getcode();
        //将验证码图片输出
        $vcode->outimg();

    表单测试代码如下

    <?php
        session_start();
    if(isset($_POST['dosubmit'])) {
        if(strtoupper($_SESSION['code']) == strtoupper($_POST['code']) ) {//验证输入的验证码
            echo "输入成功!<br>";
        }else{
            echo "输入不对!<br>";
        }
    }
    ?>
    
    <body>
        <form action="reg.php" method="post">
            username: <input type="text" name="username"> <br>
            password: <input type="password" name="password"> <br>
            code: <input type="text" onkeyup="if(this.value!=this.value.toUpperCase()) this.value=this.value.toUpperCase()" size="6" name="code"> 
                  <img src="code.php" onclick="this.src='code.php'" />  <br>
                  <!--
                  1、将在输入框中的字符,当keyup的时候自动将里面的字符转换成大写
                  2、点击图片是会切换验证码        
                   -->
            <input type="submit" name="dosubmit" value="登 录"> <br>
            
        </form>
    </body>
  • 相关阅读:
    测试用例练习2
    测试小尝试
    两个栈实现队列 Python实现
    treap Python实现
    AVL树Python实现(使用递推实现添加与删除)
    AVL树Python实现
    跳表(skiplist)Python实现
    红黑树Python实现
    Django Middleware 之 SessionMiddleware
    软件测试——Peer Review(简介)
  • 原文地址:https://www.cnblogs.com/hxjbc/p/5188057.html
Copyright © 2011-2022 走看看