图形验证码的两种实现方式

情形一:图形验证码跟短信验证码一起,只需要将后台提供的动态链接填到(id="img")的src中即可生成动态验证码。

然后,在需要请求接口的地方,只需把(id="imgCode")中用户输入的信息通过ajax传给后台,验证验证码是否正确。

原理(后台):后台通过session存储图片上的字符串,和之后前台请求过来的带的输入的字符串参数,做比较,判断是否一样。

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>图形验证码</title>
</head>
<body>
    <form>
        <div class="imgCodeBox">
            <label for="imgCode">图形验证码</label>
            <input type="text" placeholder="请输入验证码" id="imgCode">
            <img src="" id="img">
        </div>
    </form>
</body>
</html>

情形二:用cavas,但是没有安全性,考虑到实用性的话,还是用情形一的好

<!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>

情形二转自:https://blog.csdn.net/meishuixingdeququ/article/details/52386542

原文地址:https://www.cnblogs.com/candy-Yao/p/8677517.html

时间: 2024-10-16 21:07:42

图形验证码的两种实现方式的相关文章

android 截取验证码的两种实现方式

在进行手机验证码验证时,为了提升用户体验,实现自动截取验证填充的行式,实现这个功能有两种方法,分别是利用android的广播机制和android的ContentObserver 实现. 第一种的实现方法如下: /**  * 监听返回的验证码信息,并自动补充如验证码输入框中 [一级方法]  */ public BroadcastReceiver getMessageReceive = new BroadcastReceiver() {  String address; @Override  pub

使用echarts插件做图表常见的几个问题(五)——图形的两种渲染方式

场景:echarts中图形有两种渲染方式,canvas渲染和svg渲染,分别运用在什么样的场景下 措施:Canvas 更适合绘制图形元素数量非常大(这一般是由数据量大导致)的图表(如热力图.地理坐标系或平行坐标系上的大规模线图或散点图等),也利于实现某些视觉特效:在不少场景中,SVG 具有重要的优势:它的内存占用更低(这对移动端尤其重要).渲染性能略高.并且用户使用浏览器内置的缩放功能时不会模糊. 在初始化图表实例时,传入参数选择渲染器类型,代码如下 // 使用 Canvas 渲染器(默认) v

JAVABEAN是什么和总结JAVABEAN的两种使用方式

看完这个后再也不纠结javabean是什么东西了,感谢博主,由于是Javablog不能收藏故在此转发. 以下内容转自:http://www.blogjava.net/flysky19/articles/88180.html 一. javabean 是什么? Javabean 就是一个类,这个类就定义一系列 get<Name> 和 set<Name> 方法. So simple ! Javabean 就是为了和 jsp 页面传数据化简交互过程而产生的. 自己的理解: 使用 javab

PlaceHolder的两种实现方式

placeholder属性是HTML5 中为input添加的.在input上提供一个占位符,文字形式展示输入字段预期值的提示信息(hint),该字段会在输入为空时显示. 如 1 <input type="text" name="loginName" placeholder="邮箱/手机号/QQ号"> 目前浏览器的支持情况 浏览器 IE6/7/8/9 IE10+ Firefox Chrome Safari  是否支持 NO YES YE

简易版聊天系统实现 Socket VS NIO两种实现方式

说是简单聊天系统,压根不能算是一个系统,顶多算个雏形.本文重点不在聊天系统设计和实现上,而是通过实现类似效果,展示下NIO 和Socket两种编程方式的差异性.说是Socket与NIO的编程方式,不太严谨,因为NIO的底层也是通过Socket实现的,但又想不出非常好的题目,就这样吧. 主要内容 Socket方式实现简易聊天效果 NIO方式实现简易聊天效果 两种方式的性能对比 前言 预期效果,是客户端之间进行"广播"式聊天,类似于QQ群聊天.希望以后有机会,以此简易版为基础,不断演进,演

Redis两种持久化方式(RDB&amp;AOF)

爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Redis并发锁 windows下redis基础操作与主从复制 从而 数据备份和读写分离 Redis两种持久化方式(RDB&AOF) Redis的持久化过程中并不需要我们开发人员过多的参与,我们要做的是什么呢?除了深入了解RDB和AOF的作用原理,剩下的就是根据实际情况来制定合适的策略了,再复杂一点,也就

冒泡排序及两种优化方式

冒泡排序是最常用的小型数据排序方式,下面是用C语言实现的,及其两种优化方式. 第一种优化方式是设置一个标记位来标记是否发生了交换,如果没有发生交换就提前结束: 第二种优化方式是记录最后放生交换的位置,作为下一趟比较结束的位置. #include <stdio.h> /* * 打印数组 * */ void printArray(int arr[], int n) { int i = 0; for (i = 0; i < n; ++i) { printf("%d ", a

struts2+spring的两种整合方式

借助于Spring插件(Struts2-spring-plugin-XXX.jar),我们可以非常简单地完成Spring和Struts2的整合,这种整合包括让Action自动装配Spring容器中的Bean,以及让Spring管理应用中的Action两种方式,不管采用哪种方式,完成Struts2和Spring的整合都是非常简单的,而且差别不大.一旦在Web应用中安装了Spring插件,即可充分利用该插件提供的功能: 1,可以通过Spring来创建所有的Action,Interceptor和Res

两种出错处理方式

两种出错处理方式:一种是对出错函数进行重定义,一种是对错误进行捕捉处理. ;;=================================================================================================== ;;=================================================================================================== ;;=======