本文共 8316 字,大约阅读时间需要 27 分钟。
前台代码: < asp:TextBox ID = " tbck " runat = " server " Width = " 107px " SkinID = " worm " ></ asp:TextBox > < img alt = " 看不清?点击更换 " onclick = " this.src=this.src+'?' " src = " VerifyCode.aspx " /> < asp:Button ID = " Button1 " runat = " server " OnClick = " Button1_Click " Text = " Button " /> 后台代码: if ( this .tbck.Text == Request.Cookies[ " vCode " ].Value) { Response.Write( " 相等 " ); } // VerifyCode.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; public partial class VerifyCode : System.Web.UI.Page { protected void Page_Load( object sender, EventArgs e) { VerifyCode v = new VerifyCode(); v.Length = this .length; v.FontSize = this .fontSize; v.Chaos = this .chaos; v.BackgroundColor = this .backgroundColor; v.ChaosColor = this .chaosColor; v.CodeSerial = this .codeSerial; v.Colors = this .colors; v.Fonts = this .fonts; v.Padding = this .padding; string code = v.CreateVerifyCode(); // 取随机码 v.CreateImageOnPage(code, this .Context); // 输出图片 Response.Cookies.Add( new HttpCookie( " vCode " , code)); // 使用Cookies取验证码的值 } // 验证码长度(默认6个验证码的长度) int length = 4 ; public int Length { get { return length; } set { length = value; } } // 验证码字体大小(为了显示扭曲效果,默认20像素,可以自行修改) int fontSize = 12 ; public int FontSize { get { return fontSize; } set { fontSize = value; } } // 边框补(默认1像素) int padding = 1 ; public int Padding { get { return padding; } set { padding = value; } } // 是否输出燥点(默认为输出) bool chaos = true ; public bool Chaos { get { return chaos; } set { chaos = value; } } // 输出燥点的颜色(默认灰色) Color chaosColor = Color.LightGray; public Color ChaosColor { get { return chaosColor; } set { chaosColor = value; } } // 自定义背景色(默认白色) Color backgroundColor = Color.White; public Color BackgroundColor { get { return backgroundColor; } set { backgroundColor = value; } } // 自定义随机颜色数组 Color[] colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; public Color[] Colors { get { return colors; } set { colors = value; } } // 自定义字体数组 string [] fonts = { " Arial " , " Georgia " }; public string [] Fonts { get { return fonts; } set { fonts = value; } } // 自定义随机码字符串序列(使用逗号分隔) // string codeSerial = "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"; string codeSerial = " 0,1,2,3,4,5,6,7,8,9 " ; public string CodeSerial { get { return codeSerial; } set { codeSerial = value; } } // 生成校验码图片 public Bitmap CreateImageCode( string code) { int fSize = FontSize; int fWidth = fSize + Padding; int imageWidth = ( int )(code.Length * fWidth) + 4 + Padding * 2 ; int imageHeight = fSize * 2 + Padding; System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageWidth, imageHeight); Graphics g = Graphics.FromImage(image); g.Clear(BackgroundColor); Random rand = new Random(); // 给背景添加随机生成的燥点 if ( this .Chaos) { Pen pen = new Pen(ChaosColor, 0 ); int c = Length * 15 ; for ( int i = 0 ; i < c; i ++ ) { int x = rand.Next(image.Width); int y = rand.Next(image.Height); g.DrawRectangle(pen, x, y, 1 , 1 ); } } int left = 0 , top = 0 , top1 = 1 , top2 = 1 ; int n1 = (imageHeight - FontSize - Padding * 2 ); int n2 = n1 / 4 ; top1 = n2; top2 = n2 * 2 ; Font f; Brush b; int cindex, findex; // 随机字体和颜色的验证码字符 for ( int i = 0 ; i < code.Length; i ++ ) { cindex = rand.Next(Colors.Length - 1 ); findex = rand.Next(Fonts.Length - 1 ); f = new System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold); b = new System.Drawing.SolidBrush(Colors[cindex]); if (i % 2 == 1 ) { top = top2; } else { top = top1; } left = i * fWidth; g.DrawString(code.Substring(i, 1 ), f, b, left, top); } // 画一个边框 边框颜色为Color.White g.DrawRectangle( new Pen(Color.White, 0 ), 0 , 0 , image.Width - 1 , image.Height - 1 ); g.Dispose(); return image; } // 将创建好的图片输出到页面 public void CreateImageOnPage( string code, HttpContext context) { System.IO.MemoryStream ms = new System.IO.MemoryStream(); Bitmap image = this .CreateImageCode(code); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); context.Response.ClearContent(); context.Response.ContentType = " image/jpeg " ; context.Response.BinaryWrite(ms.GetBuffer()); ms.Close(); ms = null ; image.Dispose(); image = null ; } // 生成随机字符码 public string CreateVerifyCode( int codeLen) { if (codeLen == 0 ) { codeLen = Length; } string [] arr = CodeSerial.Split( ' , ' ); string code = "" ; int randValue = - 1 ; Random rand = new Random( unchecked (( int )DateTime.Now.Ticks)); for ( int i = 0 ; i < codeLen; i ++ ) { randValue = rand.Next( 0 , arr.Length - 1 ); code += arr[randValue]; } return code; } public string CreateVerifyCode() { return CreateVerifyCode( 0 ); } } /// <summary> /// 数学算式的验证码 /// /// Author: DeltaCat (三角猫) /// </summary> public sealed class MathVerifyCode { #region 生成图片 /// <summary> /// 输出验证码表达式到浏览器 /// </summary> /// <param name="context"> httpcontext </param> /// <param name="sessionKey"> 保存运算值的SESSION的KEY </param> public void OutputImage(System.Web.HttpContext context, string sessionKey) { int mathResult = 0 ; string expression = null ; Random rnd = new Random(); /// /生成3个10以内的整数,用来运算 int operator1 = rnd.Next( 0 , 10 ); int operator2 = rnd.Next( 0 , 10 ); int operator3 = rnd.Next( 0 , 10 ); /// /随机组合运算顺序,只做 + 和 * 运算 switch (rnd.Next( 0 , 3 )) { case 0 : mathResult = operator1 + operator2 * operator3; expression = string .Format( " {0} + {1} * {2} = ? " , operator1, operator2, operator3); break ; case 1 : mathResult = operator1 * operator2 + operator3; expression = string .Format( " {0} * {1} + {2} = ? " , operator1, operator2, operator3); break ; default : mathResult = operator2 + operator1 * operator3; expression = string .Format( " {0} + {1} * {2} = ? " , operator2, operator1, operator3); break ; } using (Bitmap bmp = new Bitmap( 150 , 25 )) { using (Graphics graph = Graphics.FromImage(bmp)) { graph.Clear(Color.FromA#e8eef7); /// /背景色,可自行设置 /// /画噪点 for ( int i = 0 ; i <= 128 ; i ++ ) { graph.DrawRectangle( new Pen(Color.FromArgb(rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ))), rnd.Next( 2 , 128 ), rnd.Next( 2 , 38 ), 1 , 1 ); } /// /输出表达式 for ( int i = 0 ; i < expression.Length; i ++ ) { graph.DrawString(expression.Substring(i, 1 ), new Font(FontFamily.GenericSansSerif, 12 , FontStyle.Bold), new SolidBrush(Color.FromArgb(rnd.Next( 255 ), rnd.Next( 128 ), rnd.Next( 255 ))), 5 + i * 10 , rnd.Next( 1 , 5 )); } /// /画边框,不需要可以注释掉 graph.DrawRectangle( new Pen(Color.Firebrick), 0 , 0 , 150 - 1 , 25 - 1 ); } context.Session[sessionKey] = mathResult; /// /将运算结果存入session /// /禁用缓存 DisableHttpCache(context); /// /输出图片到浏览器,我采用的是 gif 格式,可自行设置其他格式 context.Response.ContentType = " image/gif " ; bmp.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif); context.Response.End(); } } #endregion /// <summary> /// 禁用缓存 /// </summary> /// <param name="context"> httpcontext </param> private static void DisableHttpCache(System.Web.HttpContext context) { /// /清除http缓存 context.Response.ClearHeaders(); context.Response.ClearContent(); /// /禁用http缓存 /// / http 1.1 context.Response.AddHeader( " Expires " , " Mon, 26 Jul 1997 05:00:00 GMT " ); context.Response.AddHeader( " Cache-Control " , " no-store, no-cache, max-age=0, must-revalidate " ); /// / http 1.0 context.Response.AddHeader( " Pragma " , " no-cache " ); } } 注: 如果觉得验证码太模糊,可以将画噪点的地方调整为下面的: for ( int i = 0 ; i <= 128 ; i ++ ) { graph.DrawRectangle( new Pen(Color.FromArgb(rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ), rnd.Next( 0 , 255 ))), ( float )rnd.Next( 2 , 128 ), ( float )rnd.Next( 2 , 38 ), 0.5F , // 噪点的粒度 0.5F ); // 噪点的粒度,可以调节这两个值,到认为自己满意 } // 新建一个 ashx 页面,例如: Mvc.ashx // 记得此ashx文件的类,一定要继承 System.Web.SessionState.IRequiresSessionState 才可以使用session public class Mvc : IHttpHandler, System.Web.SessionState.IRequiresSessionState { public void ProcessRequest (HttpContext context) { MathVerifyCode mvc = new MathVerifyCode(); mvc.OutputImage(context, " mvc " ); } public bool IsReusable { get { return true ; } } } 在需要显示验证码的地方,加入: < img src = " mvc.aspx " alt = "" /> 或者 < img src = " mvc.ashx " alt = "" /> 本文转自曾祥展博客园博客,原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2009/09/23/1572560.html,如需转载请自行联系原作者