CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

.net下验证码的简单实现

Posted on 2008-02-15 16:26  Charles Chen  阅读(1166)  评论(4编辑  收藏  举报

   今天在公司忙完工作后总结验证码的实现,验证码在我们日常填写表单时很常见的。我从两个方面的实现.net下验证码的实现过程。希望能够给初学者带来帮助,也希望能起到抛砖引玉的作用:
一.通过自己写代码实现(牵涉到GDI+相关知识)
1.新建一个专门生成验证码的页面如:ValidateCode.aspx
2.在该页面的Page_Load事件里实现动态随机生成验证码图片:

private void Page_Load(object sender, System.EventArgs e)
        
{
            
if(!Page.IsPostBack)
            
{
                
//RndNum是一个自定义函数
                
//这里的数字4代表显示的是4位的验证字符串!
                
//string VNum=RndNum(4); 
                string VNum=this.GenerateRandom(4);
                Session[
"VNum"]=VNum;
                
this.Validate_Code(VNum);

            }

        }
private void Validate_Code(string VNum)
        
{
            
int Gheight=(int)(VNum.Length*11.5);
            
//Gheight为图片的宽度,根据字符串长度自动改变图片宽度
            System.Drawing.Bitmap Img=new Bitmap(Gheight,20);
            Graphics g
=Graphics.FromImage(Img);
            g.DrawString(VNum,
new System.Drawing.Font("Arial",10),new System.Drawing.SolidBrush(Color.Red),3,3);
            
//在矩形内绘制字串(字串,字体,画笔颜色,左上x,左上y)

            System.IO.MemoryStream ms
=new System.IO.MemoryStream();
            Img.Save(ms,System.Drawing.Imaging.ImageFormat.Png);
            Response.ClearContent();
//需要输出图象信息 要修改HTTP头 
            Response.ContentType="image/Png";
            Response.BinaryWrite(ms.ToArray());
            g.Dispose();
            Img.Dispose();
            Response.End();
        }

 

public string GenerateRandom(int length)
        
{
            System.Text.StringBuilder newRandom
=new System.Text.StringBuilder(62);
            Random rd
=new Random();
            
for(int i=0;i<length;i++)
            
{
                newRandom.Append(constant[rd.Next(
62)]);
            }

            
return newRandom.ToString();
        }

        
private static char[] constant={'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','v','w','x','y','z',
        
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'    }
;

3.如果要在页面a.aspx生成验证码,则在该页面添加一个图片控件,假设命名为:Image1,然后在page_Load事件中写如下代码:
   //Image.ImageURL = "ValidateCode.aspx";
   这样就可以生成验证码了,ValidateCode.aspx页面可以随便放在哪里,不过要注意Image1.ImageURL 要写对,同级可以直接写ValidateCode.aspx,上一级写../ValidateCode.aspx,很方便吧。
二.验证码控件实现
用验证码实现就更简单了。通过下载点击下载就可以得到一个dll文件和相关的帮助文档.
通过把下载下来的dll文件添加到工具箱中变成自定义控件的过程拖到页面上来就可以实现验证码了。当然还可以设置有关属性。如字体的类型。表现形式,位置,长度都可以设置,具体可以参见下载下来的帮助文档。很全面。
下图是我用这种控件生成出来的效果图:
很酷吧!