zoukankan      html  css  js  c++  java
  • 用Canvas生成随机验证码(后端前端都可以)

    一 、使用前端生成验证码

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="UTF-8">
            <title></title>
        </head>
    
        <body>
            <canvas id="canvas" width="120" height="40"></canvas>
            <a href="#" id="changeImg">看不清,换一张</a>
            <script>
                /**生成一个随机数**/
                function randomNum(min, max) {
                    return Math.floor(Math.random() * (max - min) + min);
                }
                /**生成一个随机色**/
                function randomColor(min, max) {
                    var r = randomNum(min, max);
                    var g = randomNum(min, max);
                    var b = randomNum(min, max);
                    return "rgb(" + r + "," + g + "," + b + ")";
                }
                drawPic();
                document.getElementById("changeImg").onclick = function(e) {
                    e.preventDefault();
                    drawPic();
                }
    
                /**绘制验证码图片**/
                function drawPic() {
                    var canvas = document.getElementById("canvas");
                    var width = canvas.width;
                    var height = canvas.height;
                    var ctx = canvas.getContext('2d');
                    ctx.textBaseline = 'bottom';
    
                    /**绘制背景色**/
                    ctx.fillStyle = randomColor(180, 240); //颜色若太深可能导致看不清
                    ctx.fillRect(0, 0, width, height);
                    /**绘制文字**/
                    var str = 'ABCEFGHJKLMNPQRSTWXY123456789';
                    for(var i = 0; i < 4; i++) {
                        var txt = str[randomNum(0, str.length)];
                        ctx.fillStyle = randomColor(50, 160); //随机生成字体颜色
                        ctx.font = randomNum(15, 40) + 'px SimHei'; //随机生成字体大小
                        var x = 10 + i * 25;
                        var y = randomNum(25, 45);
                        var deg = randomNum(-45, 45);
                        //修改坐标原点和旋转角度
                        ctx.translate(x, y);
                        ctx.rotate(deg * Math.PI / 180);
                        ctx.fillText(txt, 0, 0);
                        //恢复坐标原点和旋转角度
                        ctx.rotate(-deg * Math.PI / 180);
                        ctx.translate(-x, -y);
                    }
                    /**绘制干扰线**/
                    for(var i = 0; i < 8; i++) {
                        ctx.strokeStyle = randomColor(40, 180);
                        ctx.beginPath();
                        ctx.moveTo(randomNum(0, width), randomNum(0, height));
                        ctx.lineTo(randomNum(0, width), randomNum(0, height));
                        ctx.stroke();
                    }
                    /**绘制干扰点**/
                    for(var i = 0; i < 100; i++) {
                        ctx.fillStyle = randomColor(0, 255);
                        ctx.beginPath();
                        ctx.arc(randomNum(0, width), randomNum(0, height), 1, 0, 2 * Math.PI);
                        ctx.fill();
                    }
                }
            </script>
        </body>
    
    </html>

    二、后端生成验证码

    暂时这个

    <html>  
    <meta http-equiv="X-UA-Compatible" content="chrome=1">  
    <head>  
    <script>  
            window.onload = function() {  
                draw();  
                var saveButton = document.getElementById("saveImageBtn");  
                bindButtonEvent(saveButton, "click", saveImageInfo);  
                var dlButton = document.getElementById("downloadImageBtn");  
                bindButtonEvent(dlButton, "click", saveAsLocalImage);  
            };  
                function draw(){  
                    var canvas = document.getElementById("thecanvas");  
                    var ctx = canvas.getContext("2d");  
                    ctx.fillStyle = "rgba(125, 46, 138, 0.5)";  
                    ctx.fillRect(25,25,100,100);   
                    ctx.fillStyle = "rgba( 0, 146, 38, 0.5)";  
                    ctx.fillRect(58, 74, 125, 100);  
                    ctx.fillStyle = "rgba( 0, 0, 0, 1)"; // black color  
                    ctx.fillText("Gloomyfish - Demo", 50, 50);  
                }  
                  
                function bindButtonEvent(element, type, handler)  
                {  
                       if(element.addEventListener) {  
                          element.addEventListener(type, handler, false);  
                       } else {  
                          element.attachEvent('on'+type, handler);  
                       }  
                }  
                  
                function saveImageInfo ()   
                {  
                    var mycanvas = document.getElementById("thecanvas");  
                    var image    = mycanvas.toDataURL("image/png");  
                    var w=window.open('about:blank','image from canvas');  
                    w.document.write("<img src='"+image+"' alt='from canvas'/>");  
                }  
      
                function saveAsLocalImage () {  
                    var myCanvas = document.getElementById("thecanvas");  
                    // here is the most important part because if you dont replace you will get a DOM 18 exception.  
                    // var image = myCanvas.toDataURL("image/png").replace("image/png", "image/octet-stream;Content-Disposition: attachment;filename=foobar.png");  
                    var image = myCanvas.toDataURL("image/png").replace("image/png", "image/octet-stream");   
                    window.location.href=image; // it will save locally  
                }  
            </script>  
    </head>  
    <body bgcolor="#E6E6FA">  
        <div>  
            <canvas width=200 height=200 id="thecanvas"></canvas>  
            <button id="saveImageBtn">Save Image</button>  
            <button id="downloadImageBtn">Download Image</button>  
        </div>  
    </body>  
    </html>  
  • 相关阅读:
    扁平化设计五大原则
    扁平化
    如何调试PHP程序
    Java中的协变与逆变
    Java的equals方法实现及其细节
    Java的clone方法效率问题
    Mac的Terminal中无法使用mvim解决方案
    SC.Lab3对于Factory的构建过程(from HIT)
    关于Lab3中对于正则表达式的应用
    关于Java构造类与对象的思考
  • 原文地址:https://www.cnblogs.com/spirit-ling/p/7401146.html
Copyright © 2011-2022 走看看