宝哥软件园

编写包含数字、拼音和汉字的验证码生成类

编辑:宝哥软件园 来源:互联网 时间:2021-09-06

这次给大家分享一个集1:小写拼音2:大写拼音3:数字4:汉字为一体的验证码生成类。从标题上感觉很普通,是的,很普通,但是生成这个验证码类的时候,可以通过参数指定验证码返回格式的规则。更重要的是,希望能给你带来一些实用性。这一章还会有mvc使用验证码验证的场景,希望大家喜欢。

验证码生成流程图

验证码生成池代码分析

在图片上画验证码

Mvc登录操作测试验证码的正确性

让我们一步步分享:

验证码生成流程图

首先来看看这次分享的验证码生成类的生成流程图:

可以看出,该图中描述的编码生成池对应于几种不同的编码内容。这里,根据参数设置,允许同时获取不同的编码内容,从而达到字符、拼音、汉字组成的验证码。具体的规则设置取决于参数;

验证码生成池代码分析

首先,从上面流程图的分析可以看出,这个验证码生成池需要并行获取不同类型的验证码数据,才能满足组合验证码,因此有以下代码可用:

///summary ///create验证码///summary//param name=' code type ' 1:小写拼音2:大写拼音3:数字4:汉字/param///返回/返回公共静态字符串create code(字符串code type=' 1 | 2 | 3 | 4 '){ var code try { if(string。isnullorhitespace(codeType)| | codeType。IndexOf(' | ')0){ CodeType=' 1 | 2 | 3 | 4 ';} var codeTypeArr=codeType。Split(新字符[]{“|”},StringSplitOptions。RemoveEmptyEntries);var strLen=codeTypeArr。长度;//task string[]taskar=new task string[strlen];for(int I=0;我是strLenI){ var val=CodeTypeArr[I];Switch (val) {case '1': //小写拼音taskarr[I]=task . factory . startnew string(()={ return getpinyinorupper(false);});打破;Case '2': //大写拼音taskarr[I]=task . factory . startnewstring(()={ return getpinyinorupper();});打破;case ' 3 ' ://number taskar[I]=task . factory . startnewstring(()={ return getshuzi();});打破;Case '4': //汉字taskar[I]=task . factory . startnewstring(()={ return gethanzi();});打破;default: break} }//等待30s任务。wait all(taskar,timespan。从秒(30));foreach(taskar中的var项){ code=item。结果;}} catch (Exception ex) {code='我爱我的祖国';}返回代码;}在这里,我们继续使用关键字Task来分配任务,以获得不同的验证码内容。个人认为最重要的是通过设置字符串codeType='1|2|3|4 '来确定验证码的组合方式,这也实现了验证码格式的多样性;

在图片上画验证码

首先要明确一点,如果要在某张图片上绘制文字,那么需要使用Graphics关键字创建画布,在图片上绘制验证码。这里,第一个代码:

///summary ///生成验证码图片流///summary ///param name='code '验证码text/param///returns stream/returns public static byte[]Create validate destream(string code='我爱我的祖国',int fontsize=18,int width=0,int height=0,string fontfamily='中国楷书'){ var bb=new byte[0];//初始化画布var padding=2;var len=code。长度;宽度=宽度=0?fontSize * 2 * (len - 1)填充* 4 :宽度;高度=高度=0?fontSize * 2高:var image=新位图(宽度、高度);var g=图形。FromImage(图像);尝试{ var Random=new Random();//清除背景颜色g .清除(颜色。白色);//画出水平中间干涉线var x1=0;var y1=高度/2;var x2=宽度;var y2=y1画线(新钢笔(颜色。DarkRed)、x1、y1、x2、y2);//font var font=new font(font family,fontsize,(font style . bold | font style . italic));var brush=new LinearGradientBrush(新矩形(0,0,图像。宽度,图像。高度)、颜色。蓝色,彩色。暗红色,1f,真);//绘制文本var string format=new string format();//Stringfomart。linealignment=stringnalignment。居中;//水平居中stringfomat。alignment=stringnalignment。居中;新矩形(点。空的,新的尺寸(宽度,高度));g . drawL(代码、字体、画笔、rf、stringFomart);//画出图片的前景干涉点为(int I=0;i 100i ) { var x=随机。下一张(图片。宽度);var y=随机。下一张(图片。身高);图像。设置像素(x,y,颜色。FromArgb(随机。next()));}//绘制图片的边框线g. drawrectangle(新笔(颜色。银色),0,0,图像。宽度-1,图像。高度-1);//保存图片流var stream=new memory stream();图像。保存(流,图像格式。JPEG);//输出图片流bb=stream。ToArray();} catch (Exception ex) { }最后{ g . Dispose();图像。dispose();}返回bb;}这里列出了绘制验证码图片的方法要点:

1.图片的高度和宽度需要设置,这取决于不同的页面布局方法,所以这里高度和宽度作为参数传递。

2.干扰线:通常验证码图片有一两条干扰线,主要是防止一些恶意用户利用图片识别软件做出不规则的破解请求。我这里只设置了水平居中的一天直线码,比如:g. drawline(新笔(颜色。暗红色)、x1、y1、x2、y2);

3.字体:好看的字体通常也是用户体验,所以这里的字体是根据需要的参数传递的;

4.验证码位于图片的垂直和水平中心。这里的关键代码是:

var stringFomart=new StringFormat();//Stringfomart。linealignment=stringnalignment。居中;//水平居中stringfomat。alignment=stringnalignment。居中;5.g . drawL(代码、字体、画笔、rf、stringFomart);主要用来在图片上画字,这是最关键的地方

6.我们通常会把验证码做成图片流,而不是实际生成一个实体的验证码图片保存到服务器,否则服务器很快就会用完磁盘,所以

//保存图片流var stream=new memory stream();图像。保存(流,图像格式。JPEG);//输出图片流bb=stream。ToArray();这句话的重要性不可忽视,主要是把画的内容保存到流里便于使用

7.最后,不要忘记使用Dispose释放画布

Mvc登录操作测试验证码的正确性

用上面的验证码生成类生成好的验证码图片,那么我们还是需要测试验证正确性和效果;接下来,我们使用mvc架构进行测试。首先,我们创建一个验证码来测试Action并生成相应的ValidCode.cshtml文件,然后定制几个不同格式的验证码来获得Action。代码如下:

公共文件结果GetValidateCode(){//返回的验证码文字定义变量代码=字符串。空的;var bb_code=ValidateCode .GetValidateCodeStream(参考代码);返回文件(bb_code,‘image/JPEG’);}公共文件结果getvalidatecode 01(){ var code=string .空的;var bb_code=ValidateCode .GetValidateCodeStream(参考代码,"1 | 2 | 3 | 4");返回文件(bb_code,‘image/JPEG’);}公共文件结果getvalidatecode 02(){ var code=string .空的;var bb_code=ValidateCode .GetValidateCodeStream(参考代码,'4 | 3 | 2 | 1');返回文件(bb_code,‘image/JPEG’);}公共文件结果getvalidatecode 03(){ var code=string .空的;var bb_code=ValidateCode .GetValidateCodeStream(参考代码,' 2 | 2 | 2 | 2 ');返回文件(bb_code,‘image/JPEG’);}公共文件结果getvalidatecode 04(){ var code=string .空的;var bb_code=ValidateCode .GetValidateCodeStream(参考代码,'4 | 4 | 4 | 4');返回文件(bb_code,‘image/JPEG’);}公共文件结果getvalidatecode 05(){ var code=string .空的;var bb_code=ValidateCode .GetValidateCodeStream(参考代码,"1 | 1 | 1 | 1");返回文件(bb_code,‘image/JPEG’);}感觉上几乎一模一样,只是对应的参数不一样,这里遵循的方法GetValidateCodeStream参数代码类型格式是:为空表示自由组合1:小写拼音2:大写拼音3:数字4:汉字;然后我们往试图中填写如下代码:

氘神牛-验证码实例/H2 div class=' container ' id=' AppVue ' table class=' table-table以文本为边框-左侧车身tr td全部随机/TD TD img src=' http :/home/GetValidateCode ' data-src=' http :/home/GetValidateCode ' id=' imgCode '/输入类型='text '名称='code '占位符='请输入验证码' form-control '/button=' BTNBTN-default '登录/button span id=' msg ' style=' color : red '/span/TD/tr TD小写|大写|数字|汉字/TD tdimg src=' http :/home/getvalidate code 01 ' data-src=' http :/home/getvalidate code ' 01 '/TD/tr TD汉字|数字|大写|小写/TD tdimg src=' http :/home/getvalidatecode 02 ' data-src=' http :/home/getvalidatecode 02 '/TD/tr TD全部大写/TD tdimg src=' http :/home/getvalidatecode 03 ' data-src=' http :/home/getvalidatecode 03 '/TD/tr TD全部汉字/TD tdimg src=' http :/home/getvalidatecode 04 ' data-src=' http :/home/getvalidatecode 04 '/TD/tr TD全部小写/TD tdimg src=' http :/home/getvalidate code 05 ' data-src=' http :/home/getvalidate code 05 '/TD/tr/t body/table/div好了咋们生成下项目,看下效果图如下:

能从图中看到我们验证码格式的不同之处,这也是文章开头说的验证码格式的多样性,当然可能还有其他组成格式请允许我暂时忽略,下面我们来做一个点击图片获取新验证码的功能和点击登录按钮去后台程序判断验证码是否匹配的例子,先来修改试图界面代码如下:

@{ ViewBag .Title=' ValidtCode } h2神牛-验证码实例/H2 div class=' container ' id=' AppVue ' table class=' table-table以文本为边框-左侧车身tr td全部随机/TD TD img src=' http :/home/GetValidateCode ' data-src=' http :/home/GetValidateCode ' id=' imgCode '/输入类型='text '名称='code '占位符='请输入验证码' form-control '/button=' BTNBTN-default '登录/button span id=' msg ' style=' color : red '/span/TD/tr TD小写|大写|数字|汉字/TD tdimg src=' http :/home/getvalidate code 01 '数据-src=http :/home/getvalidatecode 01 '/TD/tr TD汉字|数字|大写|小写/TD tdimg src=' http :/home/getvalidatecode 02 ' data-src=' http :/home/getvalidatecode 02 '/TD/tr TD全部大写/TD tdimg src=' http :/home/getvalidatecode 03 ' data-src=' http :/home/getvalidatecode 03 '/TD/tr TD全部汉字/TD tdimg src=' http :/home/getvalidatecode 04 ' data-src=' http :/home/getvalidatecode 04 '/TD/tr TD全部小写/TD tdimg src=' http :/home/getvalidate code 05 ' data-src=' http :/home/getvalidate code 05 '/TD/tr/t body/table/div script src=' http : ~/Scripts/jquery-1。 10 .2 .量滴js '/script脚本类型=' text/JavaScript ' $(function(){ $(' img ').打开('点击'),函数(){ var nowTime=new Date().getTime();var src=$(this).attr('data-src ')'?t=' nowTimeif(src。长度=0){ return;} $(这个)。attr('src ',src);});$("按钮")。on('click ',function(){ var msg=$(' # msg ');var代码=$('input[name='code']').val();if (code.length=0) { msg.html('请输入验证码!');返回;} $.post('/home/UserLogin ',{ code: code },function(result){ if(result){ msg。html(结果.味精);if(!结果. IsOk) { $('#imgCode ').单击();} } });})})/脚本然后在控制器中增加如下登录验证代码:

公共JsonResult用户登录(字符串代码){ var数据=新阶段.com。延伸。舞台模型。modata();如果(字符串IsNullOrWhiteSpace(代码)){数据.Msg='验证码不能为空;返回Json(数据);} var比较代码=Session[' code '];if(!比较代码.等于(代码)){数据Msg='验证码错误;返回Json(数据);}数据IsOk=真;数据Msg='验证码验证成功;返回Json(数据);}公共文件结果GetValidateCode() { //返回的验证码文字定义变量代码=字符串。空的;var bb_code=ValidateCode .GetValidateCodeStream(参考代码);var key=' codeif (Session[key]!=null){ 0会话。移除(键);}会话[密钥]=代码;返回文件(bb_code,‘image/JPEG’);}由于我这里无法截动态图,所点击测试获取验证码我这里直接给出线上的一个例子,各位可以试试:http://爱辛斯。com :1001/home/valid COde,点击获取新验证码的关键代码是:$(这个)。attr('src ',src);重新给img元素的可控硅整流器(可控硅整流器)赋值,不过这里要注意由于浏览器缓存的原因,这里赋值的时候需要加上一个动态参数,我这里是使用时间作为请求参数,因此有了以下的代码:$(这个)。attr('data-src ')'?t=' nowTime这是特别的地方需要注意;好了咋们来直接测试登陆是否能从后端判断验证码是否正确匹配吧,这里用的是会议来保存获取验证码图片返回的验证代码,然后在登陆时候判断用户数据的验证码是否和后台会议的验证一样:

验证失败:

验证成功:

好了测试用例就这么多,如果您觉得我这个验证码生成例子还可以并且您希望使用那么请注意,参数的传递,不同得到的验证码格式不同,主要方法是:

///summary ///获取验证码图片流////summary///Param name=' codeLen '验证码编号(codeType设置codeLen设置)/param ///Param name='codeType '为空,表示自由组合1:小写拼音2:大写拼音3:数字4:汉字/param ///返回/返回public static byte[]getvalidatedstream(ref String code,String codetype=' ',int codelen=0,int fontsize=18,int width=120,int height=30){//返回is ull blazes(codetype)){ for(int I=0;i codeLeni ) { codeType=rm。Next(1,5)' | ';} } code=CreateCode(CodeType);返回CreateValidateCodeStream(代码,fontSize,宽度:宽度,高度:高度);}您可以阅读具体参数的备注。我将在这里打包代码,以便于共享和使用:验证码生成示例

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!

更多资讯
游戏推荐
更多+