.NET生成随机验证码

新建一个Web窗体,命名为"RandomImage.aspx",意在通过它输出含有4位随机验证码的图片。其中字符是数字或大写字母。它利用了一个基本知识:数字0~9对应的ASCII码为48~57,字母A~Z对应的ASCII码为65~90。在生成随机校验码的同时,程序通过Cookies保存校验码,以便在提交表单时进行比较。

下面是RandomImage.aspx代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;    //Graphics类的头文件

public partial class RandomImage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.CreateCheckCodeImage(GenerateCheckCode());
    }
    #region web 窗体设计器生成的代码
   override protected void OnInit(EventArgs e)
   {
   //
   // CODEGEN: 该调用是 asp.NET web 窗体设计器所必需的。
   //
   InitializeComponent();
   base.OnInit(e);
   }
  
   /// <summary>
   /// 设计器支持所需的方法 - 不要使用代码编辑器修改
   /// 此方法的内容。
   /// </summary>
   private void InitializeComponent()
   {
   this.Load += new System.EventHandler(this.Page_Load);
   }
   #endregion
  
   private string GenerateCheckCode()
   {
       int number;        
       string checkCode = String.Empty;     //存放随机码的字符串
      
       System.Random random = new Random();
      
       for(int i=0; i<4; i++) //产生4位校验码
       {
           number = random.Next();
           number = number % 36;
           if (number < 10)
           {
               number += 48;    //数字0-9编码在48-57
           }
           else
           {
               number += 55;    //字母A-Z编码在65-90
           }
          
           checkCode += ((char)number).ToString();
       }
      
       Response.Cookies.Add(new HttpCookie("CheckCode", checkCode)); //将随机码存放在Cookie中
      
       return checkCode;
   }
  
   private void CreateCheckCodeImage(string checkCode)
   {
       if(checkCode == null || checkCode.Trim() == String.Empty)
       return;
      
       System.Drawing.Bitmap image = new System.Drawing.Bitmap(
           (int)Math.Ceiling((decimal)(checkCode.Length * 15)), 20);
       //创建Graphics对象
       Graphics g = Graphics.FromImage(image);
      
       try
       {
           //生成随机生成器
           Random random = new Random();
          
           //清空图片背景色
           g.Clear(Color.White);
          
           //画图片的背景噪音线 10条
           for(int i=0; i<10; i++)
           {
               //噪音线起点坐标(x1,y1),终点坐标(x2,y2)
               int x1 = random.Next(image.Width);
               int x2 = random.Next(image.Width);
               int y1 = random.Next(image.Height);
               int y2 = random.Next(image.Height);
               //用银线画出噪音线
               g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
           }
          
           //输出图片中校验码的字体:12号Arial,粗斜体
           Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
           System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(
               new Rectangle(0, 0, image.Width, image.Height),
               Color.Blue,
               Color.DarkRed,
               1.2f,
               true);
           g.DrawString(checkCode, font, brush, 2, 2);
          
           //画图片的前景噪音点50个
           for(int i=0; i<50; i++)
           {
               int x = random.Next(image.Width);
               int y = random.Next(image.Height);
              
               image.SetPixel(x, y, Color.FromArgb(random.Next()));
           }
      
           //画图片的边框线
           g.DrawRectangle(
               new Pen(Color.SaddleBrown),
               0,
               0,
               image.Width - 1,
               image.Height - 1);
          
           //创建内存流用于输出图片
           System.IO.MemoryStream ms = new System.IO.MemoryStream();
           image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
           Response.ClearContent();
           Response.ContentType = "image/Gif";
           Response.BinaryWrite(ms.ToArray());
       }
       finally
       {
           g.Dispose();
           image.Dispose();
       }
    }    
    
}

接下来,在使用校验码的位置添加HTML的<IMG>标签,将“src”属性设置为“RandomImage.aspx”,同时在
后台添加下面的验证代码:
protected void Button1_Click(object sender, EventArgs e)
    {
        //验证码检查
        if (Request.Cookies["CheckCode"] == null)
        {
            Label2.Visible = true;
            Label2.Text = "您的系统禁用Cookies,致使不能使用验证码";
            return;
        }
        //判断输入校验码是否正确
        if (string.Compare(Request.Cookies["CheckCode"].Value, TextBox6.Text, true) != 0)
        {
            Label2.Text = "验证码错误,请输入正确的验证码!";
            Label2.Visible = true;
            return;
        }
        ...//省略数据库添加数据部分
}
posted @ 2009-06-18 17:43  Hayden Han  阅读(317)  评论(0编辑  收藏  举报