开源博客项目Blog .NET Core源码学习(4:生成验证码)

  开源博客项目Blog中的后台管理登录界面中支持输入验证码(如下图所示),本文学习并记录项目中验证码的生成及调用方式。
在这里插入图片描述
  博客项目中调用VerifyCode类生成验证码,该类位于App.Framwork项目中,命名空间为App.Framwork.Generate。VerifyCode类主要包括十几种参数设置,两种验证码生成方式(随机字符串,问题型)。主要参数设置如下所示:

序号名称类型说明
1SetLengthint主要用于随机字符串型的验证码,设置随机字符串的长度,默认值为4
2SetVerifyCodeTextstring保存生成的验证码
3SetAddLowerLetterbool设置验证码中是否包含小写字母,默认值为true
4SetAddUpperLetterbool设置验证码中是否包含大写字母,默认值为true
5SetFontSizeint设置验证码的字体大小,用于生成验证码图片,默认值为18
6SetFontColorColor设置验证码的字体颜色,用于生成验证码图片,默认值为蓝色
7SetFontFamilystring设置验证码的字体名称,用于生成验证码图片,默认值为Verdana
8SetBackgroundColorColor设置验证码图片的背景色,用于生成验证码图片,默认值为AliceBlue
9SetIsBackgroundLinebool设置验证码图片中是否包含线条,以便提升识别难度
10SetForeNoisePointCountint设置验证码图片中的前景噪点数量,以便提升识别难度,默认值为2,但实际从代码来看增加的比设置的多
11SetRandomAngleint设置验证码图片中单个字符的最大旋转角度,主要用于随机字符串型的验证码,默认值为40
12SetIsRandomColorbool设置是否随机生成验证码的字体颜色,默认值为true,效果是每次生成的验证码图片中的字体颜色都是随机生成
13SetWithint设置验证码图片的宽度
14SetHeightint设置验证码图片的高度
15VerifyCodeResultstring保存问题型验证码的答案

  随机字符串型验证码的生成函数为GetVerifyCodeText,其生成步骤如下:
  1)创建字符池,首先加入1-9的数字,再根据设置分别加入大写字母和小写字母,这里特地将O和o去掉了,避免难以识别;
  2)根据验证码长度,逐一从字符池中随机取字符,用后即弃(使用StringBuilder实现,用后直接移除指定位置的内容即可),最后返回完整的验证码字符串。

  问题型验证码的生成函数为GetQuestion,其生成步骤如下:
  1)如果提供有问答对集合(即函数输入参数questionList,默认为null),则从集合中随机抽取一组问答对并返回;
  2)如果没有提供问答对集合,则随机生成100以内的加减乘除算式,并保存计算结果,然后返回算式和结果的问答对。

  验证码图片的生成函数为GetVerifyCodeImage,其生成步骤如下:
  1)创建空图片,图片高度大致为1.6倍字体大小,宽度为验证码长度倍字体大小,填充背景色;
  2)增加前景噪点,噪点数量为图片宽度乘以SetForeNoisePointCount,绘制方式为将图片随机像素点位置的颜色换为字体颜色;
  3)增加背景噪点,分为两部分,首先是噪点,数量为2倍图片宽度,绘制方式为在图片随机位置绘制宽和高均为1的矩形。接着按设置增加干扰线条,绘制方式是根据随机生成两侧坐标绘制线条;
  4)从左向右逐个绘制验证码的字符,如果需要旋转字符,则随机生成旋转角度,旋转坐标后再绘制字符,最后返回图片内容

  博客项目中LoginController类调用验证码生成类,该类位于App.Hosting项目中,命名空间为App.Hosting.Areas.Main.Controllers,具体调用函数为ValidateCode,函数返回验证码图片,并将验证码内容放在HttpContext.Session中返回,前端调用页码则是Index.cshtml。

  从上面的分析可以看出,开源博客项目Blog中提供的验证码生成类相对独立,实现逻辑清晰易懂,扩展起来也比较方便,能够按需放在其它项目或程序中。

参考文献:
[1]https://gitee.com/miss_you/Blog
[2]https://www.donet5.com/Home/Doc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/144931.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java爬虫】使用selenium获取某交易所公司半年报数据

引言 上市公司的财报数据一般都会进行公开,我们可以在某交易所的官方网站上查看这些数据,由于数据很多,如果只是手动收集的话可能会比较耗时耗力,我们可以采用爬虫的方法进行数据的获取。 本文就介绍采用selenium框架进行公司财…

QT判断平台和生成版本设置输入目录

QT判断平台和生成版本设置输入目录 pro工程文件中常用的宏定义Chapter1 QT判断平台和生成版本设置输入目录Chapter2 Qt pro文件中判断 x86/arm(aarch64)交叉编译环境,区分 linux/windows系统, debug/release版本Chapter3 Qt的版本判断、跨平台选择与pro工程文件输出…

nginx tomcat 动静分离

动静分离: 访问静态和动态页面分开 实现动态和静态页面负载均衡。 五台虚拟机 实验1,动静分离 思路: 需要设备:三台虚拟机 一台nginx 代理又是静态 两台tomcat 请求动态页面 在全局模块中配置upstream tomcat 新建location…

AD9371 官方例程HDL详解之JESD204B TX_CLK生成 (二)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…

分享一下我家网络机柜,家庭网络设备推荐

家里网络机柜搞了几天终于搞好了,非专业的,走线有点乱,勿喷。 从上到下的设备分别是: 无线路由器(当ap用):TL-XDR6088 插排:德木pdu机柜插排 硬盘录像机:TL-NVR6108-L8P 第二排左边…

仿CSGO盲盒开箱源码 盲盒商城源码 盲盒开箱源码 潮物盲盒商城源码

仿CSGO盲盒开箱源码 盲盒商城源码 盲盒开箱源码 潮物盲盒商城源码 测试环境:宝塔、Linux、PHP7.2、MySQL5.6 根目录 public,伪静态 thinkphp,php需要Redis扩展 后台:/stf 账号:admin 密码:123123 *后台…

Windows 安装 Java

1. 安装 JDK 从 Oracle 的官网下载的 JDK,例如 JDK 21 双击下载得到的 msi 文件,开始安装 JDK 选择要安装的文件路径(我一般都默认): 等待安装: 安装完成: 2. 验证是否安装成功 2.1. 打开 cmd…

反射的作用( 越过泛型检查 和 可以使用反射保存所有对象的具体信息 )

1、绕过 编译阶段 为集合添加数据 反射是作用在运行时的技术,此时集合的泛型将不能产生约束了,此时是可以 为集合存入其他任意类型的元素的 。泛型只是在编译阶段可以约束集合只能操作某种数据类型,在 编译成Class文件进入 运行阶段 的时候&a…

计算机视觉实战项目3(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

车辆跟踪及测距 该项目一个基于深度学习和目标跟踪算法的项目,主要用于实现视频中的目标检测和跟踪。该项目使用了 YOLOv5目标检测算法和 DeepSORT 目标跟踪算法,以及一些辅助工具和库,可以帮助用户快速地在本地或者云端上实现视频目标检测和…

Kubernetes 通过 Deployment 部署Jupyterlab

概要 在Kubernetes上部署jupyterlab服务,链接Kubernetes集群内的MySQL,实现简单的数据开发功能。 前置条件 镜像准备:自定义Docker镜像--Jupyterlab-CSDN博客 MySQL-Statefulset准备:StatefulSet 简单实践 Kubernetes-CSDN博客…

Linux中的开发工具(yum,vim,gcc/g++,gdb,Makefile,git)

文章目录 1. Linux软件包管理器——yumyum 语法yum 常用命令安装 yum 仓库源 2. Linux编辑器——vimvim 的五种常用模式模式切换vim 基本操作命令模式命令集(1)光标命令(2)复制粘贴命令(3)撤销与重做&#…

[H5动画制作系列]雪花随机产生飘落

雪花图片参考: 全局代码: var max120; var index0; 第一帧代码: index; if(index<max){posX550*Math.random();posY220*Math.random()-100;scale0.8*Math.random()0.2;var snowflakenew lib.snowlink();snowflake.xposX;snowflake.yposY;snowflake.scaleXscale;snowflake…