红玫瑰白玫瑰 |
2007-12-31 12:31 |
编程实例 字母+数字验证码程序
//ValidateCode.aspx.cs
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;
namespace ValidateCode { /// /// ValidateCode 的摘要说明。 /// public class ValidateCode : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 CreateCheckCodeImage(GenerateCheckCode()); } //产生随机数 private string GenerateCheckCode() { int number; string strCode = string.Empty; //随机种子 Random random = new Random(); for (int i = 0; i < 4; i++) //验证码长度为4 { //随机整数 number = random.Next(); //字符从0-9,A-Z中产生,对应的ASCII码为48-57,65-90 number = number % 36; if (number < 10) { number += 48; } else { number += 55; } strCode += ((char)number).ToString(); } //将字符串保存在Cookies Response.Cookies.Add(new HttpCookie("CheckCode", strCode)); return strCode; }
//生成图片 private void CreateCheckCodeImage(string checkCode) { //若检验码为空,则直接返回 if (checkCode == null checkCode.Trim() == string.Empty) return; //根据验证码长度确定输出图片的长度 System.Drawing.Bitmap image = new Bitmap((int)Math.Ceiling((checkCode.Length * 15)), 20); //创建Graphics对象 System.Drawing.Graphics g= Graphics.FromImage(image);
//生成随机数种子 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 Font("Arial",12,FontStyle.Bold FontStyle.Italic); //线性渐变画刷 System.Drawing.Drawing2D.LinearGradientBrush brush=new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0,0,image.Width,image.Width),Color.Blue,Color.Purple,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(); //图片格式指定为png image.Save(ms,System.Drawing.Imaging.ImageFormat.Png); //清除缓冲区流中的所有输出 Response.ClearContent(); //输出流的Http Mime类型设置为"image/Png" Response.ContentType="image/Png"; //输出图片的二进制流 Response.BinaryWrite(ms.ToArray());
//释放Bitmap和Graphics对象 g.Dispose(); image.Dispose(); } #region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); }
/// /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load);
} #endregion } }
//在需要验证的页面加入以下代码
private void cmdOk_Click(object sender, System.EventArgs e) { //判断Cookie是否为空,若为空则说明浏览器禁用了Cookie if(Request.Cookies["CheckCode"] ==null) { lblMessage.Text="您的浏览器禁用Cookie,请打开Cookie功能以使用本系统"; lblMessage.Visible=true; return; } //判断输入的验证码是否正确 if(String.Compare(Request.Cookies["CheckCode"].Value,txtCode.Text,true)!=0) { lblMessage.Text="验证码错误,请输入正确的验证码!"; lblMessage.Visible=true; return; } else { Response.Write("输入正确"); lblMessage.Visible=false; } }
|
|