zoukankan      html  css  js  c++  java
  • ASP.NET验证码生成与识别

       一般验证码页面只输出一个图片而不进行其他业务处理,所以验证码一般放在一般处理程序(httpHandler)页面中,而如果将验证码生成代码放到一般处理程序中,要将生成验证码保存在Session中,这里我们假设保存到session["ValidCode"]中,则需要添加对 System.Web.SessionState 命名空间的引用,并要实现 IHttpHandler和IRequiresSessionState接口,这样才能实现将验证码保存到session中,生成验证码示例代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Drawing;
      4 using System.Drawing.Drawing2D;
      5 using System.Text;
      6 using System.Web;
      7 using System.Web.SessionState;
      8 
      9 namespace 验证码的生成与识别
     10 {
     11     /// <summary>
     12     /// 生成验证码
     13     /// </summary>
     14     public class ValidCodeHandler : IHttpHandler,IRequiresSessionState
     15     {
     16 
     17         public void ProcessRequest(HttpContext context)
     18         { 
     19             // 产生5位随机字符
     20             string strValidCode = GetValidCode(5);                                                  
     21 
     22             //如果要使用context.Session,需要添加命名空间System.Web.SessionState   using System.Web.SessionState;  ,然后再继承IRequiresSessionState接口
     23             //将字符串保存到Session中,以便需要时进行验证
     24             context.Session["ValidCode"] = strValidCode;
     25             //定义宽120像素,高30像素的数据定义的图像对象
     26             Bitmap image = new Bitmap(120, 40);
     27             //绘制图片                                                     
     28             Graphics g = Graphics.FromImage(image);                                                 
     29             try
     30             {
     31                 //创建随机数生成器
     32                 Random random = new Random();
     33                 //清除图片背景色                                       
     34                 g.Clear(Color.White);                                                               
     35                 // 随机产生图片的背景噪线
     36                 for (int i = 0; i < 25; i++)                                               
     37                 {
     38                     int x1 = random.Next(image.Width);
     39                     int x2 = random.Next(image.Width);
     40                     int y1 = random.Next(image.Height);
     41                     int y2 = random.Next(image.Height);
     42                     g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
     43                 }
     44                 //设置图片字体风格
     45                 Font font = new System.Drawing.Font("微软雅黑", 20, (System.Drawing.FontStyle.Bold));  
     46                 LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 3, true);//设置画笔类型
     47                 //绘制随机字符
     48                 g.DrawString(strValidCode, font, brush, 5, 2);  
     49                 //绘制图片的前景噪点
     50                 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);    
     51                 //建立存储区为内存的流
     52                 System.IO.MemoryStream ms = new System.IO.MemoryStream();   
     53                 //将图像对象储存为内存流        
     54                 image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);        
     55                 //清除当前缓冲区流中的所有内容      
     56                 context.Response.ClearContent();                                                    
     57                 //设置输出流的MIME类型
     58                 context.Response.ContentType = "image/png";
     59                 //将内存流写入到输出流                         
     60                 context.Response.BinaryWrite(ms.ToArray());                                         
     61             }
     62             finally
     63             {
     64                 //释放资源
     65                 g.Dispose();
     66                 image.Dispose();
     67             }
     68         }
     69 
     70         /// <summary>
     71         /// 生成随机字符串
     72         /// </summary>
     73         /// <param name="num">随机字符的个数</param>
     74         /// <returns>返回随机产生的字符串</returns>
     75         private string GetValidCode(int num)
     76         {
     77             //定义一个允许的字符组成的字符串
     78             string strRandomCode = "ABCD1EF2GH3IJ4KL5MN6P7QR8ST9UVWXYZ";                                //定义要随机抽取的字符串
     79             //char[] chaStr = strRandomCode.ToCharArray();                                                //第二种方法:将定义的字符串转成字符数组
     80             StringBuilder sbValidCode = new StringBuilder();                                            //定义StringBuilder对象用于存放验证码
     81             //随机数生成器,用于随机产生验证码中字符
     82             Random rnd = new Random();                                                                   //随机函数,随机抽取字符
     83             for (int i = 0; i < num; i++)
     84             {
     85                 //随机获取一个字符
     86                 char a = strRandomCode[rnd.Next(0, strRandomCode.Length)];
     87                 //拼接字符
     88                 sbValidCode.Append(a);
     89             }
     90             return sbValidCode.ToString();
     91         }
     92 
     93 
     94 
     95         public bool IsReusable
     96         {
     97             get
     98             {
     99                 return false;
    100             }
    101         }
    102     }
    103 }
    生成验证码

      生成验证码之后,就是用户的输入与验证码的对比,刚才我们已经将验证码保存到session中,检查用户输入的验证码是否正确只需将用户输入值与保存到session中的值即【session["ValidCode"].ToString()】(类型转换,session["ValidCode"]转化为string类型)比较即可,我们可以在code页面验证,也可在一般处理程序中验证(更为常用,可利用Ajax技术,提高用户体验),

      code验证示例代码:

    1 //判断用户输入验证码与保存在session中验证码是否一致
    2  if (txtValidCode.Text.ToUpper() == Session["Code"].ToString().ToUpper())
    Code页验证

      一般处理程序示例代码如下:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Web;
     4 using System.Web.SessionState;
     5 
     6 namespace 验证码的生成与识别
     7 {
     8     /// <summary>
     9     /// 验证用户输入验证码是否正确
    10     /// </summary>
    11     public class Handler1 : IHttpHandler,IRequiresSessionState
    12     {
    13 
    14         public void ProcessRequest(HttpContext context)
    15         {
    16             context.Response.ContentType = "text/plain";
    17             //获取用户输入验证码
    18             string strCode = context.Request["txtValidCode"].ToString();
    19             //ToUpper(),这里验证码不区分大小写
    20             if (strCode.ToUpper() == context.Session["ValidCode"].ToString().ToUpper())
    21             {
    22                 context.Response.Write("验证码正确!");
    23             }
    24             else
    25             {
    26                 context.Response.Write("验证码错误!");
    27             }
    28         }
    29 
    30         public bool IsReusable
    31         {
    32             get
    33             {
    34                 return false;
    35             }
    36         }
    37     }
    38 }
    httpHandler验证
  • 相关阅读:
    Fedora 12/Debian 以root登录图形界面
    贡献一个简单的日志类
    "没有 pthread_create 的手册页条目"解决办法
    OpenBSD 下架设vsftpd
    NetSnmp初步(一):让我们的程序提供snmp服务
    linux socket接收、发送小工具(支持tcp、udp包(组播)的发送接收)
    NetSnmp初步(二):发送Notification
    netbeans添加现有源文件时自动更新Makefile依赖关系
    Fedora Core12的防火墙会过滤掉部分IP数据包,在开发调试时建议关闭防火墙
    NetSnmp初步(三):接收控制命令:实现SNMP的SET命令
  • 原文地址:https://www.cnblogs.com/weihanli/p/4012170.html
Copyright © 2011-2022 走看看