用来向登录页面输出验证码图片的一般处理程序页面


 这是自己以前做的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>

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM