用HttpHandler实现asp.net 的验证码功能

用HttpHandler实现asp.net 的验证码功能

由于现在的注册机、发帖机等垃圾软件实在太多,为了有效的拦截这些信息,许多站点都需要用到验证码,下面就用HttpHandler实现的验证码机制

  1. /* *********************************************** 
  2. * Author:          1987raymond 
  3. * Team:            Juice Sharing 
  4. * Created Time:    2009-3-10 19:22:46 
  5. * CopyRight:       Juice Sharing 团队版权所有 保留一切权利 
  6. * NameSpace:       Juice.Common.HttpHandlers 
  7. * Class/Interface: ValidateCodeRender 
  8. * ***********************************************/ 
  9.  
  10. using System; 
  11. using System.Text; 
  12. using System.Web; 
  13. using System.Drawing; 
  14. using System.Drawing.Imaging; 
  15. using System.Web.SessionState; 
  16.  
  17. namespace Juice.Common.HttpHandlers 
  18.     /// <summary> 
  19.     /// 验证码生成器 
  20.     /// </summary> 
  21.     public sealed class ValidateCodeRender : IHttpHandler, IRequiresSessionState 
  22.     { 
  23.         /// <summary> 
  24.         /// 构造函数 
  25.         /// </summary> 
  26.         public ValidateCodeRender() 
  27.         { } 
  28.  
  29.         #region 私有字段 
  30.  
  31.         /// <summary> 
  32.         /// 验证码的长度 
  33.         /// </summary> 
  34.         private int m_CodeLength = 5; 
  35.  
  36.         /// <summary> 
  37.         /// 保存到会话状态中的值 
  38.         /// </summary> 
  39.         private string m_SessionName = "validateCode"
  40.  
  41.         /// <summary> 
  42.         /// 图像的宽 
  43.         /// </summary> 
  44.         private int m_ImageWidth = 160; 
  45.  
  46.         /// <summary> 
  47.         /// 图像的长 
  48.         /// </summary> 
  49.         private int m_ImageHeight = 60; 
  50.  
  51.         /// <summary> 
  52.         /// 图像背景色 
  53.         /// </summary> 
  54.         private Color m_BackgroundColor = Color.FromArgb(212, 236, 189); 
  55.  
  56.         /// <summary> 
  57.         /// 图像上验证码的颜色 
  58.         /// </summary> 
  59.         private Color m_CodeColor = Color.FromArgb(132, 199, 1); 
  60.  
  61.         /// <summary> 
  62.         /// 干扰图形的颜色 
  63.         /// </summary> 
  64.         private Color m_ObstructionColor = Color.Gray; 
  65.  
  66.         /// <summary> 
  67.         /// 用来生成随机验证码的字符串 
  68.         /// </summary> 
  69.         private const string m_CodeString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890我和你的大小"
  70.  
  71.         #endregion 
  72.  
  73.         #region IHttpHandler 成员 
  74.  
  75.         /// <summary> 
  76.         /// 是否可以重用 
  77.         /// </summary> 
  78.         public bool IsReusable 
  79.         { 
  80.             get { return true; } 
  81.         } 
  82.  
  83.         /// <summary> 
  84.         /// 处理请求 
  85.         /// </summary> 
  86.         /// <param name="context"></param> 
  87.         public void ProcessRequest(HttpContext context) 
  88.         { 
  89.             ///设置输出的格式 
  90.             context.Response.ContentType = "image/gif"
  91.             Random random = new Random(); 
  92.             ///用来保存随机取得的字符串 
  93.             StringBuilder s = new StringBuilder(); 
  94.             ///创建绘图的图像 
  95.             using (Bitmap bitmap = new Bitmap(this.m_ImageWidth, this.m_ImageHeight)) 
  96.             { 
  97.                 ///创建绘图图面,用此对象将各种符号等绘制到制定的图像上 
  98.                 using (Graphics graphics = Graphics.FromImage(bitmap)) 
  99.                 { 
  100.                     ///生成背景颜色 
  101.                     graphics.FillRectangle(new SolidBrush(this.m_BackgroundColor), 0, 0, this.m_ImageWidth, this.m_ImageHeight); 
  102.  
  103.                     #region 生成验证码 
  104.                     ///验证码的字体 
  105.                     using (Font font = new Font(FontFamily.GenericSerif, 32, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Pixel)) 
  106.                     { 
  107.                         for (int i = 0; i < this.m_CodeLength; i++) 
  108.                         { 
  109.                             s.Append(ValidateCodeRender.m_CodeString.Substring(random.Next(0, m_CodeString.Length - 1), 1)); 
  110.                             ///将字符绘制到图像上 
  111.                             graphics.DrawString(s[s.Length - 1].ToString(), font, new SolidBrush(this.m_CodeColor), i * 32, random.Next(0, 24)); 
  112.  
  113.                         } 
  114.                     } 
  115.                     #endregion 
  116.  
  117.                     #region 绘制干扰图形和噪点 
  118.  
  119.                     //干扰图形绘制画笔 
  120.                     using (Pen pen = new Pen(new SolidBrush(this.m_ObstructionColor), 1)) 
  121.                     { 
  122.                         for (int i = 0; i < 10; i++) 
  123.                         { 
  124.                             graphics.DrawLine(pen, new Point(random.Next(0, this.m_ImageWidth - 1), random.Next(0, this.m_ImageHeight - 1)), new Point(random.Next(0, this.m_ImageWidth - 1), random.Next(0, this.m_ImageHeight - 1))); 
  125.  
  126.                         } 
  127.                     } 
  128.                     for (int i = 0; i < 100; i++) 
  129.                     { 
  130.  
  131.                         bitmap.SetPixel(random.Next(this.m_ImageWidth), random.Next(this.m_ImageHeight), Color.FromArgb(random.Next())); 
  132.                     } 
  133.  
  134.  
  135.                     #endregion 
  136.  
  137.                     ///保存图像到输出流 
  138.                     bitmap.Save(context.Response.OutputStream, ImageFormat.Gif); 
  139.                 } 
  140.             } 
  141.             ///将验证码的值保存到用户会话状态中,并且不区分大小写 
  142.             context.Session[this.m_SessionName] = s.ToString().ToLower(); 
  143.             context.Response.End(); 
  144.         } 
  145.  
  146.         #endregion 
  147.     } 

上面这个类就是绘制验证码图像并且输出到页面的类,它实现了IHttpHandler接口

下面再到web.config的 <httpHandlers>节点中添加此项:

  1. <add verb="GET" path="ValidateCode.aspx" validate="false" type="Juice.Common.HttpHandlers.ValidateCodeRender,Juice.Common" /> 

Juice.Common.HttpHandlers.ValidateCodeRender,Juice.Common 根据你自己的情形而定

下面则是在具体的页面中调用:

测试验证码:

  1. <img src="/ValidateCode.aspx" alt="验证码" id="validateCode" /><a 
  2.                     href="javascript:refreshCode();">刷新验证码</a> 
  3. <script language="javascript" type="text/javascript"> 
  4.                 function refreshCode() 
  5.                 { 
  6.                 var e=gid("validateCode"); 
  7.                 e.src="/ValidateCode.aspx"+"?t="+new Date().toTimeString(); 
  8.                 } 
  9.                 </script> 

效果如下图所示:

 

大家注意下这个地方:

  1. ///将验证码的值保存到用户会话状态中,并且不区分大小写 
  2.                context.Session[this.m_SessionName] = s.ToString().ToLower(); 

我是把验证码保存在Session中的,所以如果你需要检查某个用户输入是否正确就只需看其值和Session中的值是不是一样的


同时有一点注意下就是我看到一些网上教程所把验证码的值保存在Cookie中,我想这样做是错误的,而且丧失了验证码的功能,因为Cookie是客户端也可以访问的

大家还可以扩展验证码 的内容,比如改成算术等等的形式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值