zoukankan      html  css  js  c++  java
  • 生成验证码类

    <?php
    
    /**
     * 验证码类
     * Class VerifyCode
     */
    class VerifyCode {
        
        protected $redisObj;
        
        private $charset    = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789'; // 随机因子
        private $codelen    = 4;    // 验证码长度
        private $width      = 85;   // 宽度
        private $height     = 30;   // 高度
        private $fontsize   = 14;   // 指定字体大小
        private $code;  // 验证码
        private $img;   // 图形资源句柄
        private $font;  // 指定的字体
        private $fontcolor; // 指定字体颜色
        
        public function getRedisObj() {
            return $this->redisObj;
        }
        
        protected function setRedisObj($configName='') {
            
            try {
                if ('' === $configName) {
                    $obj        = new RedisService();
                }
                else {
                    $obj        = new RedisService($configName);
                }
                
                $this->redisObj = $obj->getInstance();
            }
            catch (Exception $e) {
                throw $e;
            }
            
        }
        
        //构造方法初始化
        public function __construct($width=85, $height=30) {
            
            $this->setRedisObj();
            $this->width    = $width;
            $this->height   = $height;
            $this->font     = $_SERVER['DOCUMENT_ROOT'].PUBLIC_PATH.DIRECTORY_SEPARATOR.'file'.DIRECTORY_SEPARATOR.'elephant.ttf';
            
        }
        
        //生成随机码
        private function createCode() {
            
            $_len = strlen($this->charset)-1;
            
            for ($i=0; $i<$this->codelen; $i++) {
                $this->code .= $this->charset[mt_rand(0, $_len)];
            }
            
        }
        
        //生成背景
        private function createBg() {
            
            $this->img  = @imagecreate($this->width, $this->height);
            $color      = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
            imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color);
            
        }
        
        //生成文字
        private function createFont() {
            
            $_x = $this->width/$this->codelen;
            
            for ($i=0; $i<$this->codelen; $i++) {
                $this->fontcolor = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
                imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x*$i+mt_rand(1, 5), $this->height/1.4, $this->fontcolor, $this->font, $this->code[$i]);
            }
            
        }
        
        //生成线条、雪花
        private function createLine() {
            
            for ($i=0; $i<3; $i++) {
                $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
                imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color);
            }
            
            for ($i=0; $i<50; $i++) {
                $color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
                imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), '*', $color);
            }
            
        }
        
        //输出
        private function outPut() {
            
            header('Content-type: image/png');
            imagepng($this->img);
            imagedestroy($this->img);
            
        }
        
        //对外生成
        public function doimg() {
            
            $logTitle   = '生成验证码';
            $this->createBg();
            $this->createCode();
            $this->createLine();
            $this->createFont();
            $sessionId  = session_id();
            $verifyCode = $this->getCode();
            $this->redisObj->hSet(SysConst::REDIS_VERIFY_CODE_KEY, $sessionId, $verifyCode);
            $this->redisObj->expire(SysConst::REDIS_VERIFY_CODE_KEY, SysConst::REDIS_EXPIRE_TIME);
            $result     = setcookie(SysConst::VERIFY_CODE_ID, $sessionId, time()+SysConst::REDIS_EXPIRE_TIME, '/');
            $logStr     = __CLASS__.'|'.__FUNCTION__.'|'.__LINE__.'|'.$logTitle.'|redisKey:'.SysConst::REDIS_VERIFY_CODE_KEY.'|key:'.$sessionId.'|verifyCode:'.$verifyCode.'|cookieVerifyCodeId:'.$sessionId.'|setCookieResult:'.((1 == $result) ? 'true' : 'false').'|trace:'.json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), JSON_UNESCAPED_UNICODE);
            Log::write($logStr);
            $this->outPut();
            
        }
        
        //获取验证码
        public function getCode() {
            return strtolower($this->code);
        }
        
    }
  • 相关阅读:
    JavaScript原生对象属性和方法详解——Array对象[转]
    SVN的trunk branch tag (二)
    git入门使用摘录
    文字画工具推荐
    mysql 基础操作
    mobile 测试入门思维导图
    淘宝性能测试线下测试与线上跟踪体系
    github使用入门 之GIT GUI Windows版
    C++ 单向链表反转
    shell脚本实例一,移动文件夹中大于2000B的文件到另一个文件夹
  • 原文地址:https://www.cnblogs.com/wjs2019/p/14788756.html
Copyright © 2011-2022 走看看