标题:[转帖]如何用Asp.Net生成验证码
只看楼主
寂寞的影子
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-1-12
 问题点数:0 回复次数:9 
[转帖]如何用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">&nbsp; </td> <td width="9">&nbsp;</td> <td width="88">&nbsp;</td> <td width="87">&nbsp;</td> <td width="100">&nbsp;</td> <td width="68">&nbsp;</td> <td width="97">&nbsp;</td> </tr> <tr> <td height="21"></td> <td></td> <td colspan="3" valign="top"><asp:label id="lblshow" runat="server"></asp:label></td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td height="14"></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <td height="21">&nbsp;</td> <td colspan="2" valign="middle">验证码:</td> <td valign="top"><asp:image id="image1" runat="server" imageurl="gif.aspx" /></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td height="20">&nbsp;</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>&nbsp;</td> </tr> <tr> <td height="25">&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td height="19">&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td valign="top"><asp:button id="btnsubmit" runat="server" text="比较" onclick="btnsubmit_click" /></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> </table> </div> </form> </body> </html>
<html> <body> <form runat="server"> <div align="center"> <table width="750"> <!--dwlayouttable--> <tr> <td width="256" height="46">&nbsp; </td> <td width="9">&nbsp;</td> <td width="88">&nbsp;</td> <td width="87">&nbsp;</td> <td width="100">&nbsp;</td> <td width="68">&nbsp;</td> <td width="97">&nbsp;</td> </tr> <tr> <td height="21"></td> <td></td> <td colspan="3" valign="top"><asp:label id="lblshow" runat="server"></asp:label></td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td height="14"></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <td height="21">&nbsp;</td> <td colspan="2" valign="middle">验证码:</td> <td valign="top"><asp:image id="image1" runat="server" imageurl="gif.aspx" /></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td height="20">&nbsp;</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>&nbsp;</td> </tr> <tr> <td height="25">&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td height="19">&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> <td valign="top"><asp:button id="btnsubmit" runat="server" text="比较" onclick="btnsubmit_click" /></td> <td>&nbsp;</td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> </table> </div> </form> </body> </html>
搜索更多相关主题的帖子: Net 转帖 Asp 验证 
2005-01-16 19:24
regedit
Rank: 5Rank: 5
等 级:贵宾
威 望:19
帖 子:950
专家分:0
注 册:2004-6-8
得分:0 
好东西,我顶顶,收藏啦~

最新作品:百货品牌商品资讯第一门户([url]http://www./[/url]),欢迎交流
2005-01-17 09:51
acheqi
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2005-1-21
得分:0 
up一下,虽然自己已经搞出来了,但是想一下开始自己为了他抓狂,支持一下
2005-01-21 16:29
水易雨辰
Rank: 1
等 级:新手上路
帖 子:177
专家分:0
注 册:2004-4-15
得分:0 
支持一把!

授人以鱼,不如授人以渔!
2005-01-24 14:06
sheng01
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-2-5
得分:0 
好支持
2005-02-05 17:36
tlin
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-3-1
得分:0 
yes ,太好了,我终于找到了生成验证码的方法了,
虽然我用的是C#但把它修改过来应该很容易。
谢了,
UP!!

冷风
2005-03-01 16:46
darius
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-11-22
得分:0 
非常感谢,
2005-11-22 16:17
haoshuaiya
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-11-6
得分:0 
asp.net实用验证码代码(直接调用)
private string CreateRandomCode(int codeCount)
    {
        string allChar = "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";
        string[] allCharArray = allChar.Split(',');  //以","为分割符把allChar拆分成数据;
        string randomCode = "";
        int temp;
        Random rand = new Random();
        for (int i = 0; i < codeCount; i++)
        {
            int t = rand.Next(35);
            temp = t;
            randomCode += allCharArray[t];
        }
        return randomCode;
    }
    //给随即字符添加干扰
    private void CreateImage(string checkCode)
    {
        int iwidth = (int)(checkCode.Length * 11.5);
        //封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成  .指定宽度和高度。以象素为单位
        System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20);
        //封装一个 GDI+ 绘图图面。无法继承此类.  从指定的 Image 创建新的 Graphics
        Graphics g = Graphics.FromImage(image);
        //font封装在特定设备上呈现特定字体所需的纹理和资源  (字体,大小,字体样式)
        Font f = new System.Drawing.Font("Arial", 10, System.Drawing.FontStyle.Bold);
        /**Brush定义用于填充图形形状(如矩形、椭圆、饼形、多边形和封闭路径)的内部的对象
        SolidBrush(Color.White)初始化指定颜色 指定画笔颜色为白色**/
        Brush b = new System.Drawing.SolidBrush(Color.White);
        //清除整个绘图面并以指定背景色填充
        g.Clear(Color.Red);
        /**在指定位置并且用指定的 Brush 和 Font 对象绘制指定的文本字符串
        (指定的字符串,字符串的文本格式,绘制文本的颜色和纹理,所绘制文本的左上角的 x 坐标,坐标)**/
        g.DrawString(checkCode, f, b, 3, 3);
        //定义用于绘制直线和曲线的对象。(指示此 Pen 的颜色,指示此 Pen 的宽度的值)
        Pen blackPen = new Pen(Color.Blue, 0);

        Random rand = new Random();
        for (int i = 0; i < 3; i++)
        {
            //随即高度
            int y = rand.Next(image.Height);
            //绘制一条连接由坐标对指定的两个点的线条   
            //(线条的颜色、宽度和样式,第一个点的 x 坐标,第一个点的 y 坐标,第二个点的 x 坐标,第二个点的 y 坐标)
            g.DrawLine(blackPen, 0, y, image.Width, y);
        }

      
        //创建存储区为内存的流
         ms = new ();
        //将此图像以指定的格式保存到指定的流中(将其保存在内存流中,图像的格式)
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        //清除缓冲区将流中的内容输出
        Response.ClearContent();
        //获取输出流的类型
        Response.ContentType = "image/Jpeg";
        //将二进制字符串写入HTTP输出流
        Response.BinaryWrite(ms.ToArray());
        g.Dispose();
        image.Dispose();
    }
2008-11-06 10:56
yutianyi
Rank: 2
等 级:论坛游民
帖 子:113
专家分:12
注 册:2008-7-18
得分:0 
LZ下次发帖能不能像LS一样有点格式,你那个密密麻麻一篇人都看疯掉了
2008-11-07 10:53
铲铲
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:506
专家分:0
注 册:2006-5-2
得分:0 
各位,置顶帖子里已有一个完整的验证码控件源码,基本能满足大家的要求。
https://bbs.bccn.net/thread-237184-1-1.html

如果有需要验证码控件的(dll文件,带pdb),可以在上面帖子中给出邮件地址,我将发送。另,稍后我将会在论坛上提供该控件的dll下载。

铲铲是也
2008-11-08 00:39



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-11392-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.144932 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved