验证码,除了12306,我还没有服过谁
为了防止暴力注册或爬虫爬取等机器请求,需要验证操作者是人还是机器,便有了验证码这个设计。本文作者主要介绍了如何使用 Axure 来设计一个动态的图形验证码,一起来学习一下吧。
在软件设计中,为了防止暴力注册或爬虫爬取等机器请求,需要验证操作者本尊是人还是机器,因此催生了验证码这个设计,目前验证码已经衍生出许多的形式,包括图形验证、数学运算、点选文字、滑动拼图等,本文作者主要介绍怎么使用 Axure 来设计一个动态的图形验证码。
一、验证码外观
验证码的外观设计大家可以各自发挥自己的创意,以下是我绘制的,仅供大家参考:
可以给大家提供几点思路:使用识别和阅读有一定难度的字体,比如带倾斜、描边或变形的一些字体添加干扰因素,比如线条、背景等设置跟背景相近或相似的字体颜色
原则就是能够尽可能干扰用户对文字的识别,当然,不能让用户完全识别不出来,不然就失去了它存在的意义。
二、验证码字库
常规的图形验证码文字主要由大小写字母+数字组成,因此我们需要将所有会用到的文字放到字库中,生成的时候只需要从字库中挑选即可。为了方便调用,我们使用【全局变量】来存储字库,在 Axure 顶部菜单中找到【项目】,点开之后选择【全局变量】:
接着我们添加一个全局变量【code_library】并输入默认值,默认值是【0-9,A-Z,a-z】的所有字符:
三、验证码位数
一般常见图形验证码都是4位,现在也有一些平台为了提升难度,会增加到5位或6位,为了能够灵活控制验证码位数,我们也同样通过变量来控制位数的生成,在【全局变量】中添加【code_bits】,默认值是4:
四、验证码存储
我们生成验证码的时候,并不是一下子就从字库中挑选出指定位数的验证码,而是一个一个字符挑选出来,最终组成指定位数的验证码,在挑选过程中,需要有一个变量来存储已经挑选出来的字符,所以,我们还需要一个变量,用来存储生成的验证码,在【全局变量】中添加【code】,无需默认值:
五、验证码生成器
上文提到,我们需要按指定位数从字库中逐一挑选字符来组成验证码,也就是说,验证码的生成过程是一个循环的过程,因此,我们可以使用一个【动态面板】来作为验证码的生成器,当动态面板循环的时候,按照指定的位数从字库中挑选字符(动态面板如何循环调用可参考我之前发过的文章《【Axure 动态面板】让你的动画变成"永动机"》),所以,这里我们先在页面中拖入一个动态面板,并确保动态面板中至少有2个状态(状态中无需放置任何内容,Axure 9.0 建议将动态面板拖动到【负空间】):
至此,我们所有的准备工作就做完了,接下来我们就来实现验证码的生成逻辑。
六、验证码生成思路
首先,我们先来拆解一下生成的步骤:
总结一下思路:当验证码载入或被点击时,验证码生成器【动态面板】开始循环;生成器循环时,判断验证码【code】的长度是否等于指定的位数【code_bits】,如果是,表示已经从字库【code_liabrary】中挑选出足够字符,这时可以停止生成器循环,并把验证码显示出来;如果验证码的长度【code】不等于指定位数【code_bits】,表示还没有挑选出足够的字符,这个时候就从字库【code_library】随机挑选一个字符添加到验证码【code】中,直到字符数满足指定的位数,停止生成器循环并将验证码显示出来。
思路基本清晰了,但在动手之前,我们还需要知道这个设计中的一个难点,就是怎么从字库【code_library】中【随机】挑选一个字符,这里就会涉及到几个【函数表达式】:LVAR.charAt(index):我们可以用这个函数来从字库【code_library】中取字符,这个函数的作用是从字符串【LVAR】中取出排在【index】位置的字符,这里需要注意,【index】的索引值是从0开始的,也就是说,index = 0 表示取出第一个字符,index = 1 表示取出第二个字符,以此类推,最后一个字符的 index = LVAR.length-1。Math.random:我们可以用这个函数作为上述函数的索引值【index】,随机生成取值的索引,这个函数的作用是随机生成0-1的小数,如果我们要随机生成0-n的小数,我们只需要将 Math.random 乘以 n(Math.random() * n) 就行了,这个 n 的取值需要确保在字库的长度范围内,超过字库的长度范围就会取不到值,所以 n = code_library.length-1 ( index 索引是从0开始,所以要减去1,否则当 n = code_library.length 时会取不到值。Math.floor(x):Math.random 生成的是小数,但LVAR.charAt(index) 中的 index 必须是整数,所以我们可以通过这个函数来对Math.random 生成的小数进行取整,这个函数的作用是返回 x 的下舍整数,简单说就是将生成的结果,只保留整数,舍去小数部分,例:Math.floor(1.23) = 1。
所以要从字库中随机取值,完整的函数表达式就是:code_library.charAt(Math.floor(Math.random*(code_library.length-1)))。
这下,我们可以开始动手进行配置了。
七、生成验证码
首先给验证码添加点击事件,【单击时】开启验证码生成器(动态面板)循环,循环间隔设为0毫秒即可:
接着,我们给验证码生成器添加【状态改变时】的事件,这里需要区分两种场景:
场景1:验证码位数=指定位数,表示验证码生成成功,我们只需要停止生成器循环并把验证码显示出来即可:
场景2:验证码位数≠指定位数,表示验证码未生成成功,需要从字库中随机挑选一个字符添加到验证码【code】中:
上图中后半部分的表达式上文已经解释过了,这里就不再赘述,关于为什么要在那个表达式前面加上[[code]],这里解释一下:
假设验证码生成器循环4次,每次从字库中抽出的字符分别是1、2、3、4,如果不加[[code]],则循环4次分别是以下4种结果:第一次循环:1第二次循环:2第三次循环:3第四次循环:4
从上面4次循环的结果可以看出,每次生成之后都会给【code】重新赋值,所以【code】永远都只会有一个数字,就会陷入无限的循环中,而在前面添加[[code]]之后,4次循环的结果是:第一次循环:1第二次循环:12第三次循环:123第四次循环:1234
因为每一次循环都会将之前已经生成的【code】拼接到新生成的【code】,再重新赋值给【code】,所以才能形成上述这种追加内容的效果,然后在第四次循环结束之后,验证码【code】长度满足指定长度,退出循环并显示验证码,接下来我们在浏览器中看看效果:
效果是对的,但是只有第一次点击有效,后面怎么点击都不会变化,哪里出了问题呢?
我们来分析一下,既然第一次点击能生成说明随机生成验证码的逻辑是没有问题的,那问题应该是出在判断验证码位数的那个逻辑上,原来,【code】默认是空的,所以第一次点击的时候能够正常生成,但是第二次点击的时候,因为【code】已经有值,所以不会再次生成,所以这里我们在点击验证码时,应该先清空【code】:
这样就能确保每次点击验证码时【code】都没有值,才能够正常生成,再来看看修改后的效果:
现在还有一个问题,就是验证码在载入时就会自动生成,但目前还是显示我们设置的默认文本,这里我们做个简单的优化,你可以将验证码【单击时】的事件复制粘贴到验证码【载入时】的事件中,不过这里有一种更简单的方式,就是给验证码【载入时】添加触发验证码【单击时】的事件,简单说就是在验证码载入时自动点击自身并生成:
刷新页面看看效果:
最后,来验证一下验证码位数控制的功能是否正常,将【code_bits】改为6,再看看效果:
跟预期效果是一样的,至此,全部教程结束,感谢阅读。
本文由 @产品锦李 原创发布于人人都是产品经理,未经许可,禁止转载。
题图来自Unsplash,基于CC0协议。
该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务。
治疗嗓子的一个中成药,咽炎干痒喉咙堵得慌,都可以用它秋天到了,很多人会觉得嗓子干哑嗓子疼痛,或者觉得嗓子里面像是有一团东西堵着,非常难受,严重的,甚至说不出话来。这可能是秋天天气干燥,损伤了咽喉的津液,导致咽喉失去润泽形成的,从中医
李晟生孩子李佳航门口嗓子喊哑了,顺转剖不顺利,李佳航蹲下痛哭01hr有一次李佳航和李晟在那儿站着,当时李晟就说你要在这儿晃一个小时吗?李佳航就很认真的跟她说你以为你生孩子的时候我就晃了几个小时吗?我晃了超过一天了呀02hr说到这里,李晟就忍
大爷大妈围聚河边放生矿泉水?放生,不应被当成儿戏古话常说心诚则灵,这不,最近广东就有网友发现有几位大爷大妈,围聚在河边,放生起了身边成堆的矿泉水。网友偶遇放生矿泉水的大爷大妈这也是够让人匪夷所思的了。听说过放生虾龟,放生野生动物
李景亮排名大变动,再次激起拳迷愤怒UFC279混乱且圆满的结束,但对于中国武粉和李景亮来说,这一次比赛的结果并不那么友好。不仅与夜魔的人气大战取消,和罗德里格兹的对决结果也颇受争议。罗德里格兹(左)VS李景亮(右)
地球上最贵的分手费在这个这个动荡的世界,各国的富豪在不断刷新着离婚分手费的记录。其中漂亮国首富及互联网巨头亚马逊公司的CEO杰夫贝佐斯(JeffBezos)与其前妻麦肯奇(MackenzieBezo
宝马集团董事长齐普策继续扩大在华投资,加强跨国合作共谋发展过去十年中,中国建立了强大的可持续的技术产业基础,无论是太阳能风能动力电池还是新能源汽车,中国不单单在市场容量方面处于领先地位,更是引领全球的创新。中国经营报记者获悉,宝马集团董事
半年赚五个亿!涪陵榨菜的消费逻辑是什么?关于涪陵榨菜,有两条人们熟知却又不完全正确的理论。第一条低收入农民工是榨菜的主要消费群体,还有专门的榨菜理论根据涪陵榨菜在全国各地区的销售额变化可以推断人口流动趋势。第二条榨菜业绩
孔子不姓孔其实很多人都搞错了答案让人诧异您知道孔子姓什么吗?同样的问题,在1952年伟人毛主席游孔庙的时候,也问过当时在场的人,当时把在场的所有人问得面面相觑,就连当时在场的孔氏子孙都蒙了。要追溯孔子的姓氏,先来讲述一下
探班能博会!硬核出圈,新能源新技术正上新山西日报新媒体记者刘妍报道聚焦双碳战略,坚持高质量发展。9月1日,2022中国(太原)国际能源产业博览会在太原开幕。一批技术新实力强的新能源高科技企业,带着硬核产品在此聚集,与科技
买油车的用户很悲惨?智己汽车天使轮用户维权解决了吗?刘涛话说这几年造车新势力借助电动车的风口起飞后,一改汽车行业严谨优雅的行事风格,把这个行业搞得乌烟瘴气像娱乐圈。买燃油车的用户很悲惨?这不,近日据媒体报道,造车新势力的大佬之一智己汽车
为什么手机厂商都在堆硬件,就不能好好打磨系统每次手机厂商发新品,就会有一些机友问机哥。为什么大家都在堆硬件,就不能好好打磨打磨系统吗?这问题看多几次,机哥真的脑溢血都要出来了。也怪机哥,系统这东西,还是机哥说得少了。在不断给
大溪地入境放宽!无需检测与健康证明!7色火山泻湖,想念已久大溪地群岛最新入境政策!8月起前往法国本土或大溪地群岛的旅客,无论来自哪个国家或地区,均无需出示健康证明!大溪地又名塔希提岛,这里有宛如钻石般清澈透明的海水,世界上少有的奢美华贵的
高铁3小时内,北京中秋周边游秋日来,微凉至。北方已经开始加衣服了,随着秋日的降临,一些好消息也接踵而至。还在只有3天假期,要不要出去玩这件事上纠结,中秋就已经近在眼前了。不甘心憋在家里又不知道去哪好?上期,阿
耶路撒冷,耶稣遇难安葬复活之地圣墓大教堂alquds(耶路撒冷)圣墓教堂的钥匙是一套两把铁钥匙,可以追溯到中世纪时期。自1187年以来,从SalahulDunAyyubi时代起,圣墓教堂的门和钥匙被委托给两个穆斯林家庭N
国庆去哪里看中国古城古镇古村古寨江南六大古镇同理古镇几千年的物质文化积累,使这片广阔的土地形成了,无数映射着中华民族文化之光的乡村聚落,它们以多彩的形态古朴的民风独特的建筑和深厚的文化底蕴而被称为传统文化的明珠多少年来,中国古城古镇
9月旅行,这5个绝美地不能错过炎热的夏天终于过去啦,秋高气爽的9月马上来临,气候适宜,凉爽又畅快,让人忍不住想要来一场说走就走的旅行。强烈推荐这5个地方,为你的身体和心灵都来一场洗涤。1。青岛,是一座海滨风光秀
辽宁十大暑期亲子游胜地出炉来源辽宁日报随着新学期即将到来,暑假游也画上句号。日前携程发布的2022年暑期亲子游报告(以下简称报告)显示,携程平台上来自辽宁的旅游订单中,亲子订单占比近三成,张氏帅府博物馆老虎
洪坑土楼群,山水人文浑然丘陵延绵轩邈,满山郁郁,闽西南山坳谷地,洪坑古村悠然而神秘,村西有笔峰樵唱,南有狮港观鱼,村内星阁可吟诗,榕荫可消夏,山水人文融一体。洪川溪清越蜿蜒穿村而过,夏风拂面,溪畔芭蕉掩映
带老人孩子旅行,吃喝玩乐一车包揽!国产大平米房车,去哪都舒服相较于常见的C型和B型房车,轻卡房车给人最直观感受应该是其庞大的体型,虽然高大,但不可否认的是在长途旅行中,其动力功能配置和空间舒适性,都是无可挑剔的。而在轻卡房车领域内,瓦纳卡五
全球市场第一手机巨头重返中国,国产手机将迎来巨大挑战?有消息称,三星从第四季开始再次回归中国市场。2019年,三星关闭中国最后一家工厂,宣布正式退出中国市场。三星从1992年开始进驻中国市场,经历了27年见证了中国经济的腾飞,也见证了
为何有些人又开始重新使用现金了?我也才明白,早清楚早受益引言而如今的智能手机功能越来越强大,很多智能手机如同一部小小的电脑,能够满足人们的生活和工作。不仅如此,智能手机的移动支付功能也在颠覆着人们以往的生活方式,很多人都可以凭借一部手机
恐龙灭绝新说法引起热议,是它导致恐龙的灭绝?恐龙是2。3亿年前中生代时期的动物,在6500万年前白垩纪时代结束的时候突然全部消失,成为地球生物进化史上的一个谜,这个谜至今仍无人能解!关于恐龙灭绝的原因,现代科学还没有找到真正