在web系统中很多时候需要用到校验码,例如我们经常遇到不少电子邮件、论坛的注册过程需要我们输入校验码,这是为了提高安全性。今天我们就来讲讲如何生成校验码。
使用asp.net来生成校验码图像很方便,网上也有不少教程与文章有介绍,但是都讲的太简单了,不够实用。我来介绍一点自己的思路,算是抛砖引玉吧。
首先我们来看看,生成校验码的一种常见方式:
1. 生成校验码的字符串
2. 将该字符串输出为图像
具体步骤
下面我们就开始简单的例子来介绍这个过程,首先打开vs.net,新建一个web site,添加一个新的 web form,取名为 vcode.aspx,在其代码文件(vcode.aspx.vb)中添加一个函数generatevcode,此函数用于生成校验码的字符串,具体代码如下:
| ''' <summary> ''' 产生随机数(包含字母与数字)用于校验码 ''' </summary> ''' <param name="codelength"></param> ''' <returns></returns> ''' <remarks></remarks> private function generatevcode(byval codelength as integer) as string dim vcode as string = string.empty dim randobj as new random() dim c as integer = 63 for i as byte = 1 to codelength c = randobj.next(35) if c >= 10 then c += 7 end if c += 48 vcode += chr(c) next return vcode end function |
| ''' <summary> ''' 产生随机的笔触样式(用于图像的背景) ''' </summary> ''' <returns></returns> ''' <remarks></remarks> private function generatehatchstyle() as hatchstyle dim slist as new arraylist for each style as hatchstyle in system.enum.getvalues(gettype(hatchstyle)) slist.add(style) next dim randobj as new random() dim index as integer = randobj.next(slist.count - 1) return ctype(slist(index), hatchstyle) end function |
| ''' <summary> ''' 产生随机数校验码图像 ''' </summary> ''' <remarks></remarks> private function generatevcodeimage() dim obitmap as bitmap = new bitmap(90, 35) dim ographic as graphics = graphics.fromimage(obitmap) dim forecolor as system.drawing.color dim backcolor as system.drawing.color dim stext as string = generatevcode(5) '获取校验码字符串 dim sfont as string = "comic sans ms" '设置自己喜欢的字体 '前景、背景的颜色 forecolor = color.fromargb(220, 220, 220) backcolor = color.fromargb(190, 190, 190) '设置用于背景的画笔 dim obrush as new hatchbrush(ctype(generatehatchstyle(), hatchstyle), forecolor, backcolor) '用于输出校验码的画笔 dim obrushwrite as new solidbrush(color.gray) '生成的图像矩形大小 ographic.fillrectangle(obrush, 0, 0, 100, 50) ographic.textrenderinghint = textrenderinghint.antialias dim ofont as new font(sfont, 14) dim opoint as new pointf(5.0f, 4.0f) ographic.drawstring(stext, ofont, obrushwrite, opoint) response.contenttype = "image/jpeg" obitmap.save(response.outputstream, imageformat.jpeg) obitmap.dispose() return stext end function |
| protected sub page_load(byval sender as object, byval e as system.eventargs) handles me.load dim code as string = generatevcodeimage() session("vcode") = code end sub |