时间:2010-08-13 | 栏目:ASP/.NET语言 | 点击:次
很多文章只讲诉了如何输出一个随机生成数字或字符的图象,当然这是验证码的核心了,但是对很多ASP.NET的初学者来说,怎么使用它生成的图象又成了一个问题(论坛有不少问这个的),这也是我写本文的一个原因.
关于验证码的原理,就不多说了,大家可以参见其他文章,文末附有完整的实例代码,里面有详细的注释,你可以跳过解说文字,直接使用
首先,要简要说说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的<<ASP.NET ViewState 初探>>一文 
有时代码本身就比任何解说更有表现力,所以在此就不对代码解说太多了,本文实现的验证码需要用到两个文件: 
gif.aspx           该文件用于生成验证码 
ValidateCode.aspx  该文件用来测试验证码(即如何使用) 
下面给出gif.aspx的完整代码:
<%@ import namespace="System"%> 
<%@ import namespace="System.io"%> 
<%@ import namespace="System.Drawing"%> 
<%@ import namespace="System.Drawing.Imaging"%> 
<script language="vb" runat="server"> 
Sub Page_Load(Sender as object,e as eventargs) 
'RndNum是一个自定义函数 
dim VNum as string=RndNum(4) 
Session("VNum")=VNum 
ValidateCode(VNum) 
End Sub 
'生成图象验证码函数 
Sub ValidateCode(VNum) 
Dim Img as System.Drawing.Bitmap 
Dim g as Graphics 
Dim ms as MemoryStream 
dim gheight as integer=Int(Len(VNum)*11.5) 
'gheight为图片宽度,根据字符长度自动更改图片宽度 
img=new BitMap(Gheight,20) 
g=Graphics.FromImage(img) 
g.DrawString(VNum,(New Font("Arial",10)),(New SolidBrush(color.blue)),3,3)'在矩形内绘制字串(字串,字体,画笔颜色,左上x.左上y) 
ms=New MemoryStream() 
img.Save(ms,ImageFormat.Png) 
Response.ClearContent() '需要输出图象信息 要修改HTTP头 
Response.ContentType="image/Png" 
Response.BinaryWrite(ms.ToArray()) 
g.Dispose() 
img.Dispose() 
Response.End() 
End Sub 
'-------------------------------------------- 
'函数名称:RndNum 
'函数参数:VcodeNum--设定返回随机字符串的位数 
'函数功能:产生数字和字符混合的随机字符串 
Function RndNum(VcodeNum) 
dim Vchar as string="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z" 
dim VcArray() as string=split(Vchar,",") '将字符串生成数组 
dim VNum as string="" 
dim i as byte 
For i=1 to VcodeNum 
Randomize 
VNum=VNum & VcArray(Int(35*Rnd)) '数组一般从0开始读取,所以这里为35*Rnd 
Next 
Return VNum 
End Function 
</script> 
那么又应该如何使用该文件生成的图象验证码,看这句代码: 
<asp:Image id="Image1" runat="server" ImageUrl="gif.aspx" />