宝哥软件园

如何用ASP.NET做一个简单的验证码

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

大家都知道验证码是以图片的形式显示的,是动态生成的,所以我们需要画出来,这不得不提到GDI的绘制

科普,什么是GDI?

GDI是图形设备接口(GDI)的高级版本,提供各种丰富的图形和图像处理功能。GDI主要由二维矢量图形、图像处理和布局组成。GDI为显示各种字体、大小和样式的文本的复杂任务提供了很多支持。

先说验证码。我认为像验证码这样的图片由两部分组成,一部分是矩形背景,另一部分是上面的字母数字组合(有时有汉字,有时有纯字母或纯数字,所以没有统一的规定。如何选择看你~)。对于矩形的背景,我们可以直接将其视为画布。字母和数字的组合呢?我们可以用随机数拼出一个新的组合。就这样,我们思考了整个过程。我们来看看下面的代码:为了记录,我写的验证码是5个字符长,由大小写英文字母和数字随机组合而成。

private readonly char[]常量={ '0 ',' 1 ',' 2 ',' 3 ',' 4 ',' 5 ',' 6 ',' 7 ',' 8 ',' 9 ',' A ',' B ',' C ',' D ',' E ',' F ',' G ',' H ',' I ',' J ',' K ',' L ',' N ',' O ',' Q ',' R ',' S ',' U ',' V ',' W '//由数字和大小写英文字母组成的字符数组,受保护void page _ load (object sender,eventargs e){ bitmap bitmap=new bitmap(100,25);//创建一个宽度为100,高度为25的位图,这是我说的第一部分。矩形背景是图形G=图形。来自图像(位图);//创建画布g.Clear(颜色。黄色绿色);//用黄绿色字体填充画布fontfont1=newfont ('arial ',15);//设置字体类型和大小画笔画笔=新的实心画笔(color . blue);//设置画笔颜色Pen myPen=新笔(颜色。蓝色,5);//创建一个brush对象string builder random=new string builder(5);//创建一个变量字符串对象,用于存储随机生成的验证码Random rd=new Random();//为(int i=0)创建随机数生成器对象;我随机。能力;i ) {随机。追加(常量[rd。下一个(62)];//生成一个随机字符,添加到random } g . drawling(random . tostring(),font1,brush,10,5);//在画布上绘制字符串system . io . memory stream ms=new system . io . memory stream();//创建数据流memory stream bitmap . save(ms,system。drawing . imaging . image format . gif);//将图像的输出格式指定为gif Response。ClearContent();回应。content type=' image/Gif ';回应。binary write(ms . to array());//输出二进制数据流}生成的效果如下:

大家可能会觉得看起来很容易识别,和我们平时登录网站时输入的验证码相比,有点像小学生。当然,我们可以做一些改变,比较并增加一定的角度。

private readonly char[]常量={ '0 ',' 1 ',' 2 ',' 3 ',' 4 ',' 5 ',' 6 ',' 7 ',' 8 ',' 9 ',' A ',' B ',' C ',' D ',' E ',' F ',' G ',' H ',' I ',' J ',' K ',' L ',' N ',' O ',' Q ',' R ',' S ',' U ',' V ',' W '//由数字和大小写英文字母组成的字符数组,受保护void page _ load (object sender,eventargs e){ bitmap bitmap=new bitmap(100,25);//创建一个宽度为100,高度为25的位图,这是我说的第一部分。矩形背景是图形G=图形。来自图像(位图);//创建画布g.Clear(颜色。黄色绿色);//用黄绿色字体填充画布fontfont1=newfont ('arial ',15);//设置字体类型和大小浮动角度=60;//基本旋转角度浮子长度=0;//显示字符的基本位置,回头看笔刷笔刷=新的实体笔刷(color . blue);//设置画笔颜色Pen myPen=新笔(颜色。蓝色,5);//创建一个brush对象string builder random=new string builder(5);//创建一个变量字符串对象,用于存储随机生成的验证码Random rd=new Random();//为(int i=0)创建随机数生成器对象;我随机。能力;i ) {随机。追加(常量[rd。下一个(62)];//生成一个随机字符,并将其添加到random中。g . ReSETtransform();//将画布重置为matrix size fsize=g . measure string(random[random . length-1])。tostring(),font 1);//获取新生成的字符g. translatetransform的大小(长度大小。宽度/2,尺寸。高度/2);//选择此旋转的中心位置,例如rotatetransform ((float) rd。next double()* angle * 2-angle);//旋转g .拉绳(随机[random.length-1]。tostring(),font1,brush,newpointf (-size.width/2,-size.height/2))以任意角度;//注意,这不是前面的例子。所有五个字符都是一次绘制的,但是长度=大小。宽度是一个一个画出来的。//确保下次绘制字符的位置不会覆盖前面的字符} system . io . memory stream ms=new system . io . memory stream();//创建数据流memory stream bitmap . save(ms,system。drawing . imaging . image format . gif);//将图像的输出格式指定为gif Response。ClearContent();回应。content type=' image/Gif ';回应。binary write(ms . to array());//输出二进制数据流}生成的效果如下:

看起来更专业吗?如果还是觉得不满意,可以看看GDI的相关内容,通过增加一些有噪声的元素或者删除线条来提高识别难度。这里就不一一列举了。我们谈到了如何绘制验证码,但还有两个问题我想多说。1.我们实际输出的是一个二进制流。我们如何在页面上显示它,并与页面上的其他元素共存?这里常见的一种方法是将绘制验证码的代码放入单独的Web表单页面中,在需要显示验证码的另一个页面上放置一个img元素,并将其src属性指向验证码页面的url。例如,我写了这样一段话:

复制代码如下: ASP :图像ID=' image _ validate code ' runat=' server ' imageurl=' ~/public method/validate code . aspx ' style=' padding-left :3 px '/

其实我这里用的是常用的方法,但是我也单独写了一个web自定义控件来生成验证码,但是当它被拖进页面然后运行的时候,还是会覆盖页面的其他元素,具体原因我也不清楚。

2.验证码的主要目的是验证使用,所以除了用户名和密码是否合法外,还要判断当前输入的验证码是否与图片中的验证码一致。我在上面的代码中没有写这个。事实上,我只需要随机生成最终的验证码,并将其值存储在一个会话中。然后,在判断用户名和密码的同时比较会话值。例如:

复制代码如下: session[' log in _ validate _ code ']=random . tostring();

3.用户看不清楚怎么改这个验证码?您可以通过脚本将url重新分配给img元素的src属性,当然,如果很麻烦,也可以使用ajax。你可以自己试试。

以上就是本文大家分享的制作验证码的全过程。希望大家都能喜欢。

更多资讯
游戏推荐
更多+