经常在论坛里看到有问怎么实现验证码的帖子其实关于验证码的文章在CSDNDEVCLUB等网站上都有很多但是很多文章只讲诉了如何输出一个随机生成数字或字符的图象当然了这个是验证码的核心了但是对很多ASPNET的初学者来说怎么使用它生成的图象又成了一个问题(论坛有不少问这个的)这也是我写本文的一个原因
言归正传关于验证码的原理我就不多说了大家可以参见其他文章文末附有完整的实例代码里面有详细的注释你可以跳过解说文字直接使用
首先我要简要说说Session和ViewState的用法因为后面会用到它
把数据存储在Session中:Session(key)=test
从Session取值:dim testvalue as string=Session(key)
类似的:
把数据存储在ViewState中:ViewState(key)=test
从ViewState中取值:dim testvalue as string=ViewState(key)
关于ViewState的更详细的资料你可以参看MSDN的<<ASPNET ViewState 初探>>一文
百闻不如一见有时代码本身就比任何解说更有表现力所以在此就不对代码解说太多了本文实现的验证码需要用到两个文件:
gifaspx 该文件用于生成验证码
ValidateCodeaspx 该文件用来测试验证码(即如何使用)
下面给出gifaspx的完整代码:
<%@ import namespace=System%>
<%@ import namespace=Systemio%>
<%@ import namespace=SystemDrawing%>
<%@ import namespace=SystemDrawingImaging%>
<script language=vb runat=server>
Sub Page_Load(Sender as objecte as eventargs)
RndNum是一个自定义函数
dim VNum as string=RndNum()
Session(VNum)=VNum
ValidateCode(VNum)
End Sub
生成图象验证码函数
Sub ValidateCode(VNum)
Dim Img as SystemDrawingBitmap
Dim g as Graphics
Dim ms as MemoryStream
dim gheight as integer=Int(Len(VNum)*)
gheight为图片宽度根据字符长度自动更改图片宽度
img=new BitMap(Gheight)
g=GraphicsFromImage(img)
gDrawString(VNum(New Font(Arial))(New SolidBrush(colorblue)))在矩形内绘制字串(字串字体画笔颜色左上x左上y)
ms=New MemoryStream()
imgSave(msImageFormatPng)
ResponseClearContent() 需要输出图象信息 要修改HTTP头
ResponseContentType=image/Png
ResponseBinaryWrite(msToArray())
gDispose()
imgDispose()
ResponseEnd()
End Sub
函数名称:RndNum
函数参数:VcodeNum设定返回随机字符串的位数
函数功能:产生数字和字符混合的随机字符串
Function RndNum(VcodeNum)
dim Vchar as string=ABCDEFGHIJKLMNOPQRSTUWXYZ
dim VcArray() as string=split(Vchar) 将字符串生成数组
dim VNum as string=
dim i as byte
For i= to VcodeNum
Randomize
VNum=VNum & VcArray(Int(*Rnd)) 数组一般从开始读取所以这里为*Rnd
Next
Return VNum
End Function
</script>
那么又应该如何使用该文件生成的图象验证码看这句代码:
<asp:Image id=Image runat=server ImageUrl=gifaspx />
这就是用来显示验证码的Image控件你可以把它放在任何你喜欢的地方下面的给出详细的使用代码你把它保存为ValidateCodeaspx并把它和gifaspx放在同一目录下在浏览器中打开ValidateCodeaspx就可以测试它的效果了:
<script language=vb Runat=Server>
Sub Page_Load(Sender as objecte as eventargs)
dim VNum as string=Session(VNum)
SessionAbandon()
ViewState(VNum)=VNum
End Sub
下面的事件代码是用来测试验证码可以根据需要更改
Sub btnSubmit_click(sender as objecte as eventargs)
判断输入的验证码与所给是否相同
If txtValidateCodetext=Cstr(ViewState(VNum)) then
lblShowtext=<font color=red>提示:验证通过</font>
Else
lblShowtext=所填写的验证码与所给的不符
End If
End Sub
</script>
<html>
<body>
<form runat=server>
<div align=center>
<table width=>
<!DWLayoutTable>
<tr>
<td width= height=> </td>
<td width=> </td>
<td width=> </td>
<td width=> </td>
<td width=> </td>
<td width=> </td>
<td width=> </td>
</tr>
<tr>
<td height=></td>
<td></td>
<td colspan= valign=top><asp:label ID=lblShow runat=server></asp:label></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td height=></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td height=> </td>
<td colspan= valign=middle>验证码:</td>
<td valign=top><asp:Image id=Image runat=server ImageUrl=gifaspx /></td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td height=> </td>
<td colspan= valign=top>输入验证码:</td>
<td valign=top><asp:textbox ID=txtValidateCode runat=server TextMode=SingleLine /></td>
<td colspan= valign=middle><font color=#FF size=>*注意:区分大小写</font></td>
<td> </td>
</tr>
<tr>
<td height=> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td height=> </td>
<td> </td>
<td> </td>
<td valign=top><asp:button ID=btnSubmit runat=server Text=比较 onclick=btnSubmit_click /></td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
</div>
</form>
</body>
</html>