当前位置: 首页 > 图文教程 > .Net技术 > ASP.NET > 在ASP.NET下实现数字和字符相混合的验证码

ASP.NET
VS2008SP1下jQuery使用初体验
使用asp.net 2.0中的SqlBulkCopy类批量复制数据
asp.net定点执行任务总结
通过webBrowser 来轻松模拟网页来源
ASP.NET框架 数据回发与事件回发
浅谈ASP.NET内部机制
通用语言规范
GC垃圾回收
ASP.NET 配置
ASP.NET 安全认证
ASP.NET生成复合控件
asp.net中forms验证
DataTable中数据记录的统计
关于无aspx文件部署,我的一些探索心得
ASP.NET刷新页面的六种方法
ASP.NET MVC应用程序的本地化、单元测试
详解ASP.NET的四种状态
.NET与Java间进行Web Service交互的选择
自己动手实现Asp.net的MVC框架
ASP.net中网站访问量统计方法

在ASP.NET下实现数字和字符相混合的验证码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 168 ::
收藏到网摘: n/a

经常在论坛里看到有问怎么实现验证码的帖子,其实关于验证码的文章在CSDN,DEV-CLUB等网站上都有很多,但是很多文章只讲诉了如何输出一个随机生成数字或字符的图象,当然了,这个是验证码的核心了,但是对很多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" />

这就是用来显示验证码的Image控件,你可以把它放在任何你喜欢的地方,下面的给出详细的使用代码,你把它保存为ValidateCode.aspx,并把它和gif.aspx放在同一目录下,在浏览器中打开ValidateCode.aspx,就可以测试它的效果了:

<script language="vb" Runat="Server">

  Sub Page_Load(Sender as object,e as eventargs)

      dim VNum as string=Session("VNum")

      Session.Abandon()

      ViewState("VNum")=VNum

  End Sub

  '下面的事件代码是用来测试验证码,可以根据需要更改

  Sub btnSubmit_click(sender as object,e as eventargs)

      '判断输入的验证码与所给是否相同

      If txtValidateCode.text=Cstr(ViewState("VNum")) then

          lblShow.text="<font color='red'>提示:验证通过</font>"

      Else

       lblShow.text="所填写的验证码与所给的不符"

      End If

  End Sub

</script>

<html>

<body>

<form runat="server">

  <div align="center">

    <table width="750">

      <!--DWLayoutTable-->

      <tr> 

        <td width="256" height="46">  </td>

        <td width="9"> </td>

        <td width="88"> </td>

        <td width="87"> </td>

        <td width="100"> </td>

        <td width="68"> </td>

        <td width="97"> </td>

      </tr>

      <tr> 

        <td height="21"></td>

        <td></td>

        <td colspan="3" valign="top"><asp:label ID="lblShow" runat="server"></asp:label></td>

        <td> </td>

        <td> </td>

      </tr>

      <tr> 

        <td height="14"></td>

        <td></td>

        <td></td>

        <td></td>

        <td></td>

        <td></td>

        <td></td>

      </tr>

      <tr> 

        <td height="21"> </td>

        <td colspan="2" valign="middle">验证码:</td>

        <td valign="top"><asp:Image id="Image1" runat="server" ImageUrl="gif.aspx" /></td>

        <td> </td>

        <td> </td>

        <td> </td>

      </tr>

      <tr> 

        <td height="20"> </td>

        <td colspan="2" valign="top">输入验证码:</td>

        <td valign="top"><asp:textbox ID="txtValidateCode" runat="server" TextMode="SingleLine" /></td>

        <td colspan="2" valign="middle"><font color="#FF0000" size="2">*注意:区分大小写</font></td>

        <td> </td>

      </tr>

      <tr> 

        <td height="25"> </td>

        <td> </td>

        <td> </td>

        <td> </td>

        <td> </td>

        <td> </td>

        <td> </td>

      </tr>

      <tr> 

        <td height="19"> </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>