Ape.Volo项目源码学习(3:生成验证码)

Ape.Volo项目支持两种验证码方式:数字及数学公式,采用的验证码方式在Ape.Volo.Api项目的appsettings.json内的Captcha节配置,KeyLength属性值大于0时使用数字验证码,否则使用数学公式验证码。

  Captcha节配置对应Ape.Volo.Core项目的CaptchaOptions类,属性含义如下图所示:

生成验证码及验证码图片的函数是Ape.Volo.Api项目的控制器类AuthorizationController的Captcha函数,主要代码如下图所示。函数的前半部分检查客户端输入的验证码次数,尝试的失败次数超过配置的次数限制则显示验证码,失败次数保存在缓存中,key值为固定字符串+客户端IP地址,数据超时时间在配置文件的Captcha节的TimeOut值配置。函数的后半部分根据Captcha节配置生成验证码及对应的图片,生成函数为Ape.Volo.Common项目的SixLaborsImageHelper.BuildVerifyCode函数,生成的验证码图片被编码为base64字符串,连同验证码及验证码标识一并发送给客户端。验证码也保存在服务端的缓存内,有2分钟的时效性。

  SixLaborsImageHelper.BuildVerifyCode函数内部调用SixLabors包相关类及函数生成验证码图形,其主要生成验证码的逻辑如下所示:
  1)根据配置文件的Captcha节配置初始化图形对象及字体;
  2)根据配置文件的Captcha节配置的KeyLength决定验证码内容形式,如果KeyLength大于0,则调用CreateValidateCode函数生成KeyLength长度的数字字符串,否则随机生成10以内的加减乘运算字符串;
  3)生成验证码内容后,先填充图片背景色,在逐字符绘制验证码内容,每个字符的颜色随机,位置从左向右绘制;
  4)绘制6条干扰线,干扰线的颜色和位置都随机,然后再绘制60个噪点,噪点为颜色随机、位置随机、x和y方向长度均为1的线段;
  5)将生成的图片以jpg格式的字节数组返回Captcha函数。

CreateValidateCode函数用于生成指定长度的数字字符串(长度为length),其主要实现逻辑为:
  1)先生成length个不同的种子值,保存在seeks数组中;
  2)再根据种子值生成length个随机数字,保存在randMembers数组中,每个数字的值在10的length次方至Int32.MaxValue之间;
  3)从randMembers数组的每个数字中随机取一位数字保存到validateNums数组中;
  4)将validateNums数字逐个拼接位数字字符串后返回。

参考文献:

1\]https://github.com/xianhc/ape-volo-web \[2\]https://github.com/xianhc/ape-volo-admin \[3\]http://doc.apevolo.com/ \[4\]https://cn.vuejs.org/

相关推荐
gc_22992 天前
Ape.Volo项目源码学习(4:限流设置)
限流·ape.volo
LSL666_5 天前
1 验证码
java·服务器·前端·redis·验证码
黄旺鑫6 天前
系统安全设计规范 · 短信风控篇【参考】
java·经验分享·系统·验证码·设计规范·短信·风控
gc_229910 天前
Ape.Volo项目源码学习(2:数据库结构)
数据库·ape.volo
shizhenshide19 天前
机器学习在验证码识别中的应用实践
验证码·ezcaptcha
shizhenshide1 个月前
使用EzCaptcha API解决FunCaptcha的完整流程
验证码·captcha·recaptcha·ezcaptcha·recaptcha v2
AscendKing2 个月前
一个开源免费的验证码系统简介 天爱验证码
开源·验证码·好好学电脑
shizhenshide2 个月前
为什么有时候 reCAPTCHA 通过率偏低,常见原因有哪些
开发语言·php·验证码·captcha·recaptcha·ezcaptcha
shizhenshide3 个月前
reCAPTCHA 的分数阈值如何设置与调整
网络·验证码·captcha·recaptcha·ezcaptcha