验证码校验的前世今生及心得体会

笔者在大学时,曾给学校做过网站,其中包含了用户注册登录功能。有用户注册登录,就需要有提交表单前的验证码校验。

这里需要说明的是,有些网站的登录注册一开始并不需要输入验证码,但是在用户名密码输入错误一次以上以后,验证码输入框便会弹出。这么做的动机,无疑是在大规模数量的注册登录时,前端可以将多次错误请求挡在外面。可以有效防止机器注册或登录对服务器资源的侵占。

笔者刚接下这个网站制作的工作时,才大三刚开学,对于验证码的生成与输入校验,可谓一窍不通,于是开始在网上找控件或插件,功夫不负有心人,终于找到一款封装好的.net控件,并顺利的将它集成到登录功能中。这款控件的程序集叫作Vincent.AutoAuthCode.dll。大家可以直接搜索得到。非常感谢这款插件的作者及其分享者,帮助那时的我解决了这个问题。

这款验证码插件的特点是:1.零代码量,从工具箱中直接拖拽到页面上即可

            2.自动完成验证,并在输入时即时提示

            3.多种属性,能够在一定程度内,做到验证码图片的自定义

以下是其使用方法的截图:

最终效果如下图:

然而在实际工作后,这款验证码插件功能出现了瓶颈:

一方面,并不是说这插件不好,而是随着知识的增长和见识的提升,我们可以考虑自己制作验证码了。当然,自己制作验证码,其自定义特性肯定比封装好的插件强很多,某些应用场景下,需要我们能够自定义各种不同的验证码,甚至在验证码中加入汉字等。

另一方面:现在的B/S结构的web应用程序,MVC逐渐成为主流,ajax请求响应数据,依靠强大的前端JS工具,我们可以将这些数据拼装成我们想要的前台展示。从性能角度来说,服务端的工作被减少很多,大部分展示工作都交给客户端来完成。在PC、移动设备及浏览器JS引擎高速发展的今天,这逐渐成为一种趋势并能有效的提高应用程序性能。

笔者了解到:现在不少论坛已经提供了验证码的制作方案,所以在此粗略的描述下验证码的制作过程:

1.生成随机数字或字母,甚至是汉字,可控制字符长度,一般长度在4-5。

2.利用生成的字符串,绘制图片,设置图片的长度宽度等参数。

3.绘制图片的噪音点,我们看到的图片中的字符总有种乱花渐欲迷人眼的感觉,就是这么做出来的。

4.绘制图片边框。

5.将绘制好的图片保存为流返回,笔者这里使用的是一般处理程序。

输出验证码图片的代码如下:

       context.Response.ClearContent();
            context.Response.ContentType = "image/Gif";

            MemoryStream ms = CreateCodeImages.CreateCodeImg(code);
            if (null != ms)
            {
                context.Response.BinaryWrite(ms.ToArray());
            }

直接在html中调用一般处理程序,即可获得验证码图片:

这里我们自然保存了图片中的字符,将它存在服务端,用来做用户输入的校验。通常是保存在Session里。

至于memeryStream里的代码,笔者就不贴上来了,园子里的其他前辈也做了类似的工作,大家能够在其中找到绘制图片的代码。

接下来就是自制验证码的调用工作,由于ajax请求涵盖了我们和服务端交互的大部分工作,所以我们使用验证码也可以封装在ajax请求里,话不多说,上代码:


/// <summary>
/// ajax调用
/// </summary>
/// <param name="options">ajax 参数</param>
/// <param name="callback">ajax success callback function</param>
/// <param name="errorCallback">ajax error callback function</param>

///<param name="checkData">验证码校验时用户的输入</param>
/// <returns type="">$.Deferred</returns>

var ajaxWithCode = function (options, callback, errorCallback, checkData) {
            var def = $.Deferred();
            var self = this;
            //校验验证码
            $.ajax({
                url: ‘/CheckCode.ashx?code=‘ + checkData,
                type: ‘GET‘
            }).done(function (result) {
                var res = eval(‘(‘ + result + ‘)‘);
                if (res.ok) {
                    alert("验证成功");
                    //our Code
                    var defaultOptions = $.extend({
                        contentType: "application/json",
                        type: "POST",
                        dataType: "json",
                        async: true,
                        cache: false,
                        error: function (e1) {
                            if (e1.status == 44) {
                                alert(e1.responseText);
                                //$.messager.alert(‘业务异常‘, e1.responseText, ‘error‘);
                            } else if (e1.status == 42) {
                                alert(e1.responseText);
                            } else if (e1.status == 0) {
                                console.log(‘ajax call have canceled by user‘);
                            }
                            else {
                                alert(‘服务器异常‘, e1.state + ‘ ‘ + e1.responseText, ‘error‘);
                            }
                        }
                    }, options);
                    if (defaultOptions.data)
                        defaultOptions.data = ko.mapping.toJSON(defaultOptions.data);
                    else
                        delete defaultOptions.data;
                    var tt = $.ajax(defaultOptions).done(function (data) {
                        if (callback) {
                            callback(data);
                        }
                    });
                    return def;
                }
                else {
                    alert("验证失败");
                }
            });
        };

我们可以自己封装一个ajax方法,将验证码的验证放在前面,如果验证码错误,便给出错误提示,并阻止提交ajax请求,效果如下:

页面没经过美化,还请各位园友海涵。但验证码的制作及使用方式已经介绍完了,有兴趣的朋友可以试试自制验证码,并添加自己的创意,比如百度的中文验证^_^

时间: 2024-08-29 16:30:44

验证码校验的前世今生及心得体会的相关文章

工程训练大赛心得体会

从开学的筹备到期末时的比赛,工程训练大赛真的用了一学期的时间在其中付出了很多收获也很多,熬过通宵体验过什么叫做心急如焚,比赛前几个小时尝试过从新做小车,有时候真的不知道自己的潜力到底有多大,以前需要几天甚至几个星期才能做出来的车,在大家齐心协力的合作下几个小时就被做出来了,我想最令人难忘的就是在赛前把车子摔坏了,然后大家齐心协力一起重新做一辆车,并且在比赛前完成所有的调试工作. 大家都说团队合作很重要,刚开始我也不知道要怎么团队合作,走过不少弯路,知道比赛将近的时候我们小组完全凝聚起来了,小组之

博士五年的一些学术研究心得体会

学术研究的一些心得体会 当我们开始高校研究生活时,我们就踏上了学术研究之路.这是一条探索未知世界,追求知识真理之路.这条道路上布满荆棘,充满了冒险和乐趣.本文通过分享自己在博士学习阶段亲身经历的研究经验和体会(主要涉及到文献检索.文献阅读.实验设计和论文写作这四个方面),希望能帮助一些入门研究不久的同学对学术研究有新的认识,能在研究道路上少走弯路,迈向自己的成功之路. 1 引言 2014年9月,我提着行李箱一个人来到大连这陌生的城市开启了在大工的博士研究生涯.我是从大四毕业设计就已经开始接触自己

AngularJS心得体会

AngularJS早些时候有过了解,知道这是一个JS的MVC框架,同类型的框架还有Backbone等.这次是由于项目需要,学习了两天的Angular后开始着手改之前的项目代码,这里大概说一下这一周学习Angular的心得体会吧. 首相,使用Angular最大的感受就是它的设计思路完全不同于Jquery,jquery更倾向于对Dom的操作:而使用Angular则需要你有一个全局的认识,你必须知道你想要做成什么样子才可以下手去做,所以我感觉ng对前端开发的要求比jquery要高一些.先来看看Angu

关于软件项目管理的心得体会之一

目的 软件项目管理是一项涉及面较广,但是非常必要的一项技能.相较于软件开发中的其他专业技能, 又更加依赖于实践和阅历.这里想跟各位同仁分享一下自己在过往项目中的心得体会,结合些许耳熟能详的理论,起到抛砖引玉的作用. 局限性 项目管理既然是一门实践科学,所以这里跟大家分享之前,还是要说明局限性.因为我之前是在一家提供软件服务的传统软件公司工作, 所以很多项目的经验都来源于作为乙方的外包项目,同时,大部分项目都是移动相关领域.目前我在一家国内的互联网公司,从事的电商相关的应用项目. 开篇 想跟大家分

编程方法心得体会

编程学习心得和方法(转载,供新手参考)   即便是高级编程人员,像那些为开发软件工作的类库和组件高手,他们也不敢说自己精通每一种语言. 事实就是这样,每一种语言有着它们相似而又不同的语法,它们有着不同的关键字,发展出了各种各样的类库,它们的函数或者方法的声明定义都有不同,更多的差异不为我们所知. 每一种语言,它都有着太多的东西需要我们去理解和记忆,我们没有时间和精力做得太多. 对于初学者,我们最不应该急于求成,更不要试图一次性学习所有语言.事实上,我们可以选取某种语言学习.每一种语言都有着自己的

读《构建之法》的心得体会

读<构建之法>的心得体会 软件工程涉及的范围很广,对于即将投身IT业的学生而言,软件工程的内容又非常重要.读构建之法,尽管本书介绍了不少IT业正在使用的理论和技术,但是,这本书的主要思想并不是介绍所有的新思想和新技术,而是从这些新思想.新技术中总结出对自己在未来的工作中有用的东西. 在整本书中,印象最让我深刻的是“两个人的合作”这一章节.现代的软件产业经过几十年的发展,软件的结构随着用户需求的不断增加,软件的功能不断朝多元化与复杂化发展.不管是两个人的合作还是团队的合作,谈到合作不免提及规范这

Git的基本使用方法和安装&amp;心得体会

1. git的安装和github的注册.代码托管.创建organization.邀请member. (1)git的安装 因为我电脑是windows系统,所以下载的是git for windows.在官网下载非常卡,直接百度搜找百度那个下载就可以.下载后选择路径一直next就行了. (2)github的注册 没什么说的,虽然界面是英文,不过要是连这种程度的都看不懂你还是洗洗睡吧.按要求填完邮箱账号密码等常规东西就注册完了. (3)创建organization the organization's

IT增值服务实践心得体会:企业客户的钱比个人客户好赚得多

友情提示 本人喜欢直言不讳,不喜欢拐弯抹角.喜欢从客观和主观.自身和他人等多种角度去探讨问题.如有不当之处,欢迎吐槽. 若干心得体会1.企业客户的钱更好赚,个人客户的钱很难.  为什么这么说呢? a.企业有钱赚,为了更好地服务自己的客户,赚到更多的钱,花点钱,心甘情愿.只要你的商品和服务,不至于太坑. b.企业的功利心比较强,因此,非常有目标性,有动力,一定要解决自己遇到的问题. c.个人的付费意识很差,因为他们总认为自己赚的钱少,同时下意识地认为,别人花时间精力提供的服务或者劳动成果,不值钱.

关于代码的一些心得体会(大神勿喷)

关于代码的一些心得体会   前  言 Lms 入行也有很久了,一直都只是忙着工作学习,却一直没能好好静下心来好好整理一下自己.时间久了,慢慢的代码越来越熟悉,敲起来也越来越顺手,自己缺总感觉有些不对.我总觉得代码不应该就是这么简单,不应该像写记叙文一样,一条一条慢慢的就罗列出来了,返回去看了看自己刚写代码的时候功能也都能够实现了.但是还是有那么多可以优化的地方.我觉得好的代码不应该只是把功能实现那么简单,我觉得好的代码应该有以下几条特点:第一,命名要规范,第二,可复用性,第三,就是注释.当然,当