代码改变世界

Asp.net(C#)实现验证码功能

2008-10-21 17:58  TTlive  阅读(159)  评论(0编辑  收藏  举报
新建一个专门用来创建验证码图片的页面ValidateCode.aspx
它的后台cs文件代码如下:
PageLoad
  1. private void Page_Load(object sender, System.EventArgs e) 
  2. {
  3.     string checkCode = CreateRandomCode(4); 
  4.     Session["CheckCode"] = checkCode;
  5.     CreateImage(checkCode); 
  6. }

其中CreateRandomCode是自定义的函数,参数代表验证码位数

  1. private string CreateRandomCode(int codeCount)
  2. {
  3.     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";
  4.     string[] allCharArray = allChar.Split(',');
  5.     string randomCode = "";
  6.     int temp = -1; Random rand = new Random();
  7.     for (int i = 0; i < codeCount; i++)
  8.     {
  9.         if (temp != -1)
  10.         {
  11.             rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
  12.         }
  13.         int t = rand.Next(35);
  14.         if (temp == t)
  15.         {
  16.             return CreateRandomCode(codeCount);
  17.         }
  18.         temp = t;
  19.         randomCode += allCharArray[t];
  20.     }
  21.     return randomCode;
  22. }

CreateImage也是一个自定义的函数,用于生成图

  1. private void CreateImage(string checkCode)
  2. {
  3.     int iwidth = (int)(checkCode.Length * 11.5);
  4.     System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20); 
  5.     Graphics g = Graphics.FromImage(image);
  6.     Font f = new System.Drawing.Font("Arial", 10, System.Drawing.FontStyle.Bold);
  7.     Brush b = new System.Drawing.SolidBrush(Color.White);
  8.     //g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height);
  9.     g.Clear(Color.Blue); 
  10.     g.DrawString(checkCode, f, b, 3, 3);
  11.     Pen blackPen = new Pen(Color.Black, 0);
  12.     Random rand = new Random();
  13.     for (int i=0;i<5;i++)
  14.     {   
  15.         int y = rand.Next(image.Height);
  16.         g.DrawLine(blackPen,0,y,image.Width,y);
  17.     }  
  18.     System.IO.MemoryStream ms = new System.IO.MemoryStream();
  19.     image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
  20.     Response.ClearContent();
  21.     Response.ContentType = "image/Jpeg";
  22.     Response.BinaryWrite(ms.ToArray());  
  23.     g.Dispose(); 
  24.     image.Dispose();
  25. }

//g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height);
g.Clear(Color.Blue);
这两种方法都可以改变生成图片的背景颜色。下面那个for循环用来生成一些随机的水平线

在需要用到验证码的页面添加一个<asp:Image>控件即可,但是要把ImageUrl指向生成验证码的页面

  1. <asp:Image Runat="server" ID="ImageCheck" ImageUrl="ValidateCode.aspx"></asp:Image>