这是自己以前做的B/S项目中的一个输出验证码图片的页面,没什么技术含量,希望高手们不要嘲笑,只是希望为需要帮助的人尽一点绵薄之力罢了!
页面简介:该页面是一个以ashx 为后缀的一般处理程序页面,用于向登录页面输出验证码图片,验证码可以有数字和大小写字母组成,是随机产生的,具体的验证码长度可以自定义,输出的验证码图片可以有图片边框、背景噪音线和前景噪音点,当然了,具体的得根据个人的需求来选择。
代码如下:
1 <%@ WebHandler Language="C#" Class="VerificationCode" %> 2 using System; 3 using System.Drawing; 4 using System.IO; 5 using System.Web; 6 using System.Web.SessionState; 7 8 /// <summary> 9 /// VerificationCode类 10 /// </summary> 11 public class VerificationCode : IHttpHandler, IRequiresSessionState 12 { 13 // Response对象 14 HttpResponse Response = HttpContext.Current.Response; 15 16 // 实现了IHttpHandler接口中的ProcessRequest方法 17 public void ProcessRequest(HttpContext context) 18 { 19 // Session对象 20 HttpSessionState Session = context.Session; 21 CreateVerifyCodeImage((Session["VerifyCode"] = 22 GeneratorVerifyCode(4)).ToString()); 23 } 24 25 /// <summary> 26 /// 随机产生指定长度的验证码字符串 27 /// </summary> 28 /// <param name="codeCount">验证码字符的个数</param> 29 /// <returns>验证码字符串</returns> 30 private string GeneratorVerifyCode(int codeCount) 31 { 32 // 随机产生的非负数 33 int randomNumber; 34 // 根据产生的随机数,按一定规律得到的单个字符 35 char singleCode; 36 // 验证码字符串 37 string verifyCode = String.Empty; 38 Random random = new Random(); 39 for (int i = 0; i < codeCount; i++) 40 { 41 randomNumber = random.Next(); 42 //// 如果随机数能够整除3的情况 43 if (randomNumber % 3 == 0) 44 { 45 // 产生一个'0'到'9'的字符 46 singleCode = (char)('0' + randomNumber % 10); 47 } 48 else 49 { 50 51 if (randomNumber % 3 == 1) 52 { 53 // 产生一个'A'到'Z'的字符 54 singleCode = (char)('A' + randomNumber % 26); 55 } 56 else 57 { 58 // 产生一个'a'到'z'的字符 59 singleCode = (char)('a' + randomNumber % 26); 60 } 61 } 62 verifyCode += singleCode.ToString(); 63 } 64 return verifyCode; 65 } 66 67 /// <summary> 68 /// 创建验证码图片 69 /// </summary> 70 private void CreateVerifyCodeImage(string verifyCode) 71 { 72 if (string.IsNullOrEmpty(verifyCode)) 73 { 74 return; 75 } 76 Bitmap image = new Bitmap(verifyCode.Length * 16, 27); 77 Graphics g = Graphics.FromImage(image); 78 Random random = new Random(); 79 // 清空验证码图片的背景色 80 g.Clear(Color.White); 81 // 画验证码图片的背景噪音线 82 for (int i = 0; i < 25; i++) 83 { 84 int x1 = random.Next(image.Width); 85 int y1 = random.Next(image.Height); 86 int x2 = random.Next(image.Width); 87 int y2 = random.Next(image.Height); 88 // 在验证码图片上画单条背景噪音线 89 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); 90 } 91 92 // 画验证码图片 93 Font font = new System.Drawing.Font("Arial", 15, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)); 94 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); 95 g.DrawString(verifyCode, font, brush, 2, 2); 96 97 // 画验证码图片的前景噪音点 98 for (int i = 0; i < 100; i++) 99 { 100 int x = random.Next(image.Width); 101 int y = random.Next(image.Height); 102 image.SetPixel(x, y, Color.FromArgb(random.Next())); 103 } 104 105 // 画验证码图片的边框线 106 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); 107 MemoryStream ms = new MemoryStream(); 108 // 将图片保存到指定的流中 109 image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 110 Response.ClearContent(); 111 Response.ContentType = "image/Jpeg"; 112 Response.BinaryWrite(ms.ToArray()); 113 g.Dispose(); 114 image.Dispose(); 115 } 116 117 // 实现了IHttpHandler接口中的IsReusable属性 118 public bool IsReusable 119 { 120 get 121 { 122 return false; 123 } 124 } 125 }
在登录页面显示该验证码的方式为: <img class='verifyImg' src=" VerificationCode.ashx " alt="单击" />,这样验证码图片就显示在你的登录页面上了!
接下来,要做的事,不用我说大家都知道,肯定是要写该图片对象的单击事件了,因为有时候,可能用户看不清当前的验证码图片上的文本,这时候就需要为用户提供单击验证码重新获取验证码的功能了,好吧,现在我就来写它的单击事件吧!!!
1 <script type="text/javascript" src="Scripts/jquery-1.4.1.min.js"></script> 2 <script type="text/javascript"> 3 // 验证码显示框的click单击事件 4 $('.verifyImg').click(function () { 6 $(this).attr('src','Handler/ValidateCode.ashx?'); 9 }); 10 }); 11 </script>
相信大家都已经试过了,第一次单击验证码发现验证码变化了是不是很难掩饰内心的激动,第二次单击时,突然发现验证码图片没有任何变化,是不是又让大家很失望、十分失望、失望到了极点啊,呵呵,其实大家仔细想一想,就会明白,原来是缓存的缘故,因为验证码第一次单击之时,验证码页面没有缓存,所以加载了Verification.ashx,产生了一个新的验证码,这时候页面输出的验证码图片就会被缓存起来,当我们再次单击的时候,验证码页面就不会被重新加载,而是输出第一次单击所产生的验证码图片,这就是为什么第二次单击时,验证码图片没有改变的原因!其实要解决这样的问题也很简单,只要让图片对象每次单击都指向不同的url地址即可,详细请看如下代码:
<script type="text/javascript" src="Scripts/jquery-1.4.1.min.js"></script> <script type="text/javascript"> // 验证码显示框的click单击事件 $('.verifyImg).click(function () { // 下面这种方式便可解决页面缓存的问题,因为每次访问的url地址都是变化的 $(this).attr('src', 'Handler/VerificationCode.ashx?' + Math.random(1)); }); }); </script>