huidong

首页 | 会员登录 | 关于争取 2022 寒假做出汇东网 Ver3.0.0 !
搜索文章


js的实现【php的在下面】

这个代码是网上找的,因为网上好多文章用js搞的验证码根本就是输出纯文字验证码的水货,这个是用了canvas绘制了图片的,所以先记录下来。不过我丢了原博客的链接,这里就不发链接了。

<!DOCTYPE html>
<html>
<!-- head -->
<head>
  <title>图片登录验证</title>
</head>
<body>
     <input type="text" value="" placeholder="请输入验证码(区分大小写)" 
     style="height:43px;position: relative; top:-15px; font-size:20px;"id ="text">
     <canvas id="canvas" width="100" height="43" onclick="dj()" 
      style="border: 1px solid #ccc;
        border-radius: 5px;"></canvas>
     <button class="btn" onclick="sublim()">提交</button>
    </body>
    
<script>
    var show_num = [];
    draw(show_num);
    
    function dj()
    {
        draw(show_num);   
    }
    
    function sublim()
    {
        var val=document.getElementById("text").value;  
        var num = show_num.join("");
        if(val=='')
        {
            alert('请输入验证码!');
        }
        else if(val == num)
        {
            alert('提交成功!');
            document.getElementById(".input-val").val('');
            draw(show_num);

        }
        else
        {
            alert('验证码错误!\n你输入的是:  '+val+"\n正确的是:  "+num+'\n请重新输入!');
            document.getElementById("text").value='';
            draw(show_num);
        }
    }
    
    function draw(show_num)
    {
        var canvas_width=document.getElementById('canvas').clientWidth;
        var canvas_height=document.getElementById('canvas').clientHeight;
        var canvas = document.getElementById("canvas");//获取到canvas的对象,演员
        var context = canvas.getContext("2d");//获取到canvas画图的环境,演员表演的舞台
        canvas.width = canvas_width;
        canvas.height = canvas_height;
        var sCode = "A,B,C,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0,q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m";
        var aCode = sCode.split(",");
        var aLength = aCode.length;//获取到数组的长度

        for (var i = 0; i <= 3; i++)
        {
            var j = Math.floor(Math.random() * aLength);//获取到随机的索引值
            var deg = Math.random() * 30 * Math.PI / 180;//产生0~30之间的随机弧度
            var txt = aCode[j];//得到随机的一个内容
            show_num[i] = txt;
            var x = 10 + i * 20;//文字在canvas上的x坐标
            var y = 20 + Math.random() * 8;//文字在canvas上的y坐标
            context.font = "bold 23px 微软雅黑";

            context.translate(x, y);
            context.rotate(deg);

            context.fillStyle = randomColor();
            context.fillText(txt, 0, 0);

            context.rotate(-deg);
            context.translate(-x, -y);
        }
        
        // 验证码上显示线条
        for (var i = 0; i <= 5; i++)
        {
            context.strokeStyle = randomColor();
            context.beginPath();
            context.moveTo(Math.random() * canvas_width, Math.random() * canvas_height);
            context.lineTo(Math.random() * canvas_width, Math.random() * canvas_height);
            context.stroke();
        }
        // 验证码上显示小点
        for (var i = 0; i <= 30; i++)
        {
            context.strokeStyle = randomColor();
            context.beginPath();
            var x = Math.random() * canvas_width;
            var y = Math.random() * canvas_height;
            context.moveTo(x, y);
            context.lineTo(x + 1, y + 1);
            context.stroke();
        }
    }
    
    // 得到随机的颜色值
    function randomColor()
    {
        var r = Math.floor(Math.random() * 256);
        var g = Math.floor(Math.random() * 256);
        var b = Math.floor(Math.random() * 256);
        return "rgb(" + r + "," + g + "," + b + ")";
    }
    
</script>
    
    
</html>


php方面的实现

php做的网上也能找到,主要就是看你的php端支不支持GD图形库了,不过一般应该是支持的。

GD相关内容看这里:https://www.php.cn/php-weizijiaocheng-360873.html


我在网上找了这一篇:https://blog.csdn.net/chenfang0529/article/details/81295479

这一篇博客实现了用php绘制验证码,效果是可以,但是代码有点散,而且源代码是用了$_SESSION来传递验证码的值的。

所以我修改了源码,并且进行了简单封装。


使用这个库很简单~ 请耐心看一下:

做法:在网站目录下创建captcha文件夹,新建两个php文件,分别命名为 captcha_code.php 和 captcha_image.php 。

这样就可以了,然后把两个文件的代码复制进去即可,代码如下:


captcha_code.php

<?php

    /*
     *    captcha_code.php
     *    验证码输出器
     *    代码转自:https://blog.csdn.net/chenfang0529/article/details/81295479
     *    huidong 对源码进行了修改,集合成了这段代码
     *
     *    创建时间:2021.7.8
     *
     *    用法:
     *    在父文件中包含此文件,调用GetRandomCode函数得到随机验证码,
     *    再调用PrintCaptchaCode函数输出验证码图像
     *
     *    使用示例:
     *    假设有父文件index.php在目录 ./wwwroot下
     *    ./wwwroot/captcha/下有captcha_code.php和captcha_image_php
     *
     *    则在index.php中输入:
     *        <?php
     *            $src = "./captcha/";
     *            include_once($src."captcha_code.php");
     *            PrintCaptchaCode($src."captcha_image.php", GetRandomCode());
     *        ?>
     *    即可。
     *
     */

    // 得到随机验证码
    // $len 验证码长度
    // $data 验证码字典
    // 返回值为生成的随机验证码
    function GetRandomCode($len=4, $data='abcdefghijkmnpqrstuvwxy3456789')
    {
        $code = "";
        for ($i = 0; $i < $len; $i++)
        {
            $code .= substr($data, rand(0, strlen($data)-1), 1);
        }
        return $code;
    }
    
    // 输出验证码
    // $src captcha_image.php与父文件的相对位置
    // $code 验证码
    // $border 是否在验证码四周加上边框,布尔型
    function PrintCaptchaCode($src, $code, $border=false)
    {
        if(!$border)
            $border=0;
        echo "
            <iframe 
                src='".$src."?code=".$code."'
                width=100px
                height=30px
                frameborder=".$border."
                scrolling=no
            >
                验证码加载失败
            </iframe>
        ";
    }
?>


captcha_image.php

<?php

    /*
     *    captcha_image.php
     *    验证码图像显示器
     *    代码转自:https://blog.csdn.net/chenfang0529/article/details/81295479
     *    huidong 对源码进行了修改,集合成了这段代码
     *
     *    创建时间:2021.7.8
     *
     *    用法:
     *    将以链接参数code作为验证码内容,
     *    详见同目录下的captcha_code.php
     *
     */

    // 绘制验证码
    // 大小:100px*30px
    // $captcha_code 验证码内容
    function DrawCaptchaCode($captcha_code)
    {
        $image = imagecreatetruecolor(100, 30);
        $bgcolor = imagecolorallocate($image, 255, 255, 255);
        imagefill($image, 0, 0, $bgcolor);

        for ($i=0; $i < strlen($captcha_code) ; $i++)
        { 
            $fontsize=6;
            $fontcolor=imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120));
            $fontcontent = substr($captcha_code,$i,1);
            $x=($i*100/4)+rand(5,10);
            $y=rand(5,10);
            imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
        }

        for ($i=0; $i < 200; $i++)
        { 
            $pointcolor = imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200));
            imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor);
        } 
        for ($i=0; $i < 3; $i++)
        { 
            $linecolor = imagecolorallocate($image,rand(80,220),rand(80,220),rand(80,220));
            imageline($image, rand(1,99), rand(1,29),rand(1,99), rand(1,29) ,$linecolor);
        }
        
        header('content-type:image/png');
        imagepng($image);
        imagedestroy($image);
    }
    
    DrawCaptchaCode($_GET["code"]);
    
?>


保存好文件就可以了。


使用方法:



在网站目录下创建个新的php文件,或者在已有的php文件中,输入如下代码:

<?php
    $src = "./captcha/";
    include_once($src."captcha_code.php");
    PrintCaptchaCode($src."captcha_image.php", GetRandomCode());
?>

$src就是存放captcha_code.php和captcha_image.php的目录,根据实际情况而修改。

由于前面我们把这两个文件放在了captcha文件夹里面,所以$src这里是"./captcha/"。


include_once 是要包含captcha_code.php ,这样才能调用输出验证码的函数。


GetRandomCode()是得到随机验证码,详见captcha_code.php的注释

PrintCaptchaCode()是输出验证码,详见captcha_code.php的注释


至此就可以了。


效果:

图片.png






返回首页


Copyright (C) 2018-2024 huidong