c#实现验证码功能
一、验证码简介
验证码功能一般是用于防止批量注册的,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或字母或符号或文字,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。
常见的验证码有如下几种:
1、纯数字验证码,一般为四位随机数字;
2、数字+字母验证码,一般从数字(0~9)和字母(A~Z和a~z)中随机抽出几个字符组成;
3、汉字验证码,相对而言,这种验证码比较少见一点,实现起来也相对复杂一些,但在不少网站中还是可以看到的;
二、验证码的实现
1、纯数字验证码的实现
纯数字验证码的实现相对比较简单,可通过以下两种方法来实现
/// <summary> /// 数字验证码 /// </summary> /// <param name="codeCount">验证码的位数‘n’</param> /// <returns>返回‘n’位验证码的字符串</returns> private static String GetRandomint(int codeCount) { Random random = new Random(); StringBuilder sbmin = new StringBuilder(); StringBuilder sbmax = new StringBuilder(); for (int i = 0; i < codeCount; i++) { sbmin.Append("1"); sbmax.Append("9"); } return random.Next(Convert.ToInt32(sbmin.ToString()), Convert.ToInt32(sbmax.ToString())).ToString(); }
2、数字与字母组合字符串
字母与数字组合的字符串也比较简单 可以按照自己的规则去生成大小写字母
/// <summary> /// 生成验证码字符串 /// </summary> /// <param name="codeLen">验证码字符长度</param> /// <returns>返回验证码字符串</returns> private static string MakeCode(int codeLen) { if (codeLen < 1) { return string.Empty; } int number; StringBuilder sbCheckCode = new StringBuilder(); Random random = new Random(); for (int index = 0; index < codeLen; index++) { number = random.Next(); if (number % 2 == 0) { sbCheckCode.Append((char)('0' + (char)(number % 10))); //生成数字 } else { sbCheckCode.Append((char)('A' + (char)(number % 26))); //生成字母 } } return sbCheckCode.ToString(); }
3、生成图片流
原理:先生成验证码,然后把生成的验证码转化为图片流进行输出
///<summary> /// 获取验证码图片流 /// </summary> /// <param name="checkCode">验证码字符串</param> /// <returns>返回验证码图片流</returns> public static MemoryStream CreateCodeImg(string checkCode) { if (string.IsNullOrEmpty(checkCode)) { return null; } Bitmap image = new Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22); Graphics graphic = Graphics.FromImage(image); try { Random random = new Random(); graphic.Clear(Color.White); int x1 = 0, y1 = 0, x2 = 0, y2 = 0; for (int index = 0; index < 25; index++) { x1 = random.Next(image.Width); x2 = random.Next(image.Width); y1 = random.Next(image.Height); y2 = random.Next(image.Height); graphic.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); } 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.Height), Color.Red, Color.DarkRed, 1.2f, true); graphic.DrawString(checkCode, font, brush, 2, 2); int x = 0; int y = 0; //画图片的前景噪音点 for (int i = 0; i < 100; i++) { x = random.Next(image.Width); y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //画图片的边框线 graphic.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); //将图片验证码保存为流Stream返回 System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); return ms; } finally { graphic.Dispose(); image.Dispose(); } }
调用方法
在HttpHander的ProcessRequest中进行调用: pupublic void ProcessRequest(HttpContext context) { string code = MakeCode(5); context.Response.ClearContent(); context.Response.ContentType = "image/Gif"; MemoryStream ms = CreateCodeImg(code); if (null != ms) { context.Response.BinaryWrite(ms.ToArray()); } }