06
2012
06

ASP.NET 一个简单验证码的生成制作代码

使用Asp.Net进行验证码生成就是使用图片生成实体进行操作,生成一张图片,并把图片上的内容存在Session中,下面是网络中查找的代码:

网站上验证码效果一般制作方法是: 

1)使用HttpHandler(一般处理程序)绘制随机验证码的图,以及产生随机码,并输出到页面的OutputStream中。

2)页面中使用异步方式(js等)进行刷新当前页面的验证码。

【示例】

1)创建一个"一般应用处理程序ashx”,代码如下: 
public class ValidationCode : IHttpHandler
    {
        //随机发生器
        static Random r = new Random(Guid.NewGuid().GetHashCode());
        //排除黑色、透明色颜色,因为底色黑色
        static PropertyInfo[] colors = (typeof(Brushes).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Static)).Where(p => p.Name != "Black" && p.Name != "Transparent").Select(p => p).ToArray();
        //排除黑色颜色,因为底色黑色
        static PropertyInfo[] linecolors = (typeof(Pens).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Static)).Where(p => p.Name != "Black").Select(p => p).ToArray();
        //获取静态类Brushes实例对象
        static object colorobj = typeof(Brushes).GetConstructor(BindingFlags.NonPublic, null, Type.EmptyTypes, null);

        //获取静态类Pens实例对象
        static object penobj = typeof(Pens).GetConstructor(BindingFlags.NonPublic, null, Type.EmptyTypes, null);

        //每个随机字符的宽度
        const float PERNUMBERWIDTH = 40.0f;
        //每个字符的高度
        const float PERNUMBERHEIGHT = 50.0f;

        public void ProcessRequest(HttpContext context)
        {
                //获取要产生多少随机数(默认产生5个)
                int reqNum = 5;
                if (context.Request.QueryString["reqNum"] != null)
                {
                    int.TryParse(context.Request.QueryString["reqNum"], out reqNum);
                }
           
                //产生多少大的背景图
                Bitmap bt = new Bitmap((int)(PERNUMBERWIDTH*reqNum), (int)PERNUMBERHEIGHT);
                Graphics g = Graphics.FromImage(bt);
              
                //产生4个随机数(number可以被保存到Session中)
                string numbers = "";

                //绘制数字
                for (int i = 1; i <= reqNum; i++)
                {
                    numbers += r.Next(0, 9).ToString();
                    var color = (PropertyInfo)colors.GetValue(r.Next(0, colors.Length));
                    context.Response.Write(color.Name + "<br/>");
                    Brush randomcolor = (Brush)color.GetValue(colorobj, null);
                    g.DrawString(numbers[i-1].ToString(), new Font("黑体", PERNUMBERWIDTH),randomcolor, new PointF((i-1)*PERNUMBERWIDTH, 0f));
                }

                //绘制随机线条
                int linenum = r.Next(10, 21);
                for (int i = 1; i <= linenum; i++)
                {
                     var linecolor = (PropertyInfo)linecolors.GetValue(r.Next(0, colors.Length));
                    Pen randomcolor = (Pen)linecolor.GetValue(penobj, null);
                    g.DrawLine(randomcolor, new PointF((float)(r.NextDouble() * PERNUMBERWIDTH * reqNum), (float)(r.NextDouble() * PERNUMBERHEIGHT)), new PointF((float)(r.NextDouble() * PERNUMBERWIDTH * reqNum), (float)(r.NextDouble() * PERNUMBERHEIGHT)));
                }
                g.Dispose();
                context.Response.Clear();
                context.Response.ContentType = "image/jpeg";
                bt.Save(context.Response.OutputStream, ImageFormat.Jpeg);
                bt.Dispose();
                context.Response.End();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

« 上一篇下一篇 »

评论列表:

1.护腰带  2012/6/6 22:50:35 回复该留言
有用收藏了,现在用asp很舒服
对这个方面不太懂啊
3.海纳百川  2012/6/7 16:41:09 回复该留言
这个是生成,那如何验证是否正确啊?
.郑德才博客  2012/6/7 23:24:57 回复该留言
使用session记住生成验证码之前的值,然后判断这个session是否和输入的验证码相同

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。