`
灵雨飘零
  • 浏览: 34918 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
文章分类
社区版块
存档分类
最新评论

由12306动态验证码想到的ASP.NET实现动态GIF验证码(附源码)

 
阅读更多

背景:

12306网站推出“彩色动态验证码机制”,新版验证码不但经常出现字符叠压,还不停抖动,不少人大呼“看不清”,称“那个验证码,是毕加索的抽象画么!”铁总客服则表示:为了能正常购票只能这样。而多家抢票软件接近“报废”,引发不少网友不满的吐槽称“太抽象太艺术了”。

正题:

以前做项目有时候也会用到验证码,但基本都是静态的。这次也想凑凑12306的热闹。

闲言少续,切入正题,先上代码,实现方法:

 public void ShowCode()
        {
            //对象实例化
            Validate GifValidate = new Validate();

            #region 对验证码进行设置(不进行设置时,将以默认值生成)
            //验证码位数,不小于4位
            GifValidate.ValidateCodeCount = 4;
            //验证码字体型号(默认13)
            GifValidate.ValidateCodeSize = 13;
            //验证码图片高度,高度越大,字符的上下偏移量就越明显
            GifValidate.ImageHeight = 23;
            //验证码字符及线条颜色(需要参考颜色类)
            GifValidate.DrawColor = System.Drawing.Color.BlueViolet;
            //验证码字体(需要填写服务器安装的字体)
            GifValidate.ValidateCodeFont = "Arial";
            //验证码字符是否消除锯齿
            GifValidate.FontTextRenderingHint = false;
            //定义验证码中所有的字符(","分离),似乎暂时不支持中文
            GifValidate.AllChar = "1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";
            #endregion

            //输出图像(Session名称)
            GifValidate.OutPutValidate("GetCode");
        }
复制代码

调用主要方法:

复制代码
public class Validate
    {
        public string AllChar = "1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";
        public Color DrawColor = Color.BlueViolet;
        public bool FontTextRenderingHint = false;
        public int ImageHeight = 0x17;
        private byte TrueValidateCodeCount = 4;
        protected string ValidateCode = "";
        public string ValidateCodeFont = "Arial";
        public float ValidateCodeSize = 13f;

        private void CreateImageBmp(out Bitmap ImageFrame)
        {
            char[] chArray = this.ValidateCode.ToCharArray(0, this.ValidateCodeCount);
            int width = (int) (((this.TrueValidateCodeCount * this.ValidateCodeSize) * 1.3) + 4.0);
            ImageFrame = new Bitmap(width, this.ImageHeight);
            Graphics graphics = Graphics.FromImage(ImageFrame);
            graphics.Clear(Color.White);
            Font font = new Font(this.ValidateCodeFont, this.ValidateCodeSize, FontStyle.Bold);
            Brush brush = new SolidBrush(this.DrawColor);
            int maxValue = (int) Math.Max((float) ((this.ImageHeight - this.ValidateCodeSize) - 3f), (float) 2f);
            Random random = new Random();
            for (int i = 0; i < this.TrueValidateCodeCount; i++)
            {
                int[] numArray = new int[] { (((int) (i * this.ValidateCodeSize)) + random.Next(1)) + 3, random.Next(maxValue) };
                Point point = new Point(numArray[0], numArray[1]);
                if (this.FontTextRenderingHint)
                {
                    graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
                }
                else
                {
                    graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
                }
                graphics.DrawString(chArray[i].ToString(), font, brush, (PointF) point);
            }
            graphics.Dispose();
        }

        private void CreateImageGif()
        {
            AnimatedGifEncoder encoder = new AnimatedGifEncoder();
            MemoryStream stream = new MemoryStream();
            encoder.Start();
            encoder.SetDelay(5);
            encoder.SetRepeat(0);
            for (int i = 0; i < 10; i++)
            {
                Bitmap bitmap;
                this.CreateImageBmp(out bitmap);
                this.DisposeImageBmp(ref bitmap);
                bitmap.Save(stream, ImageFormat.Png);
                encoder.AddFrame(Image.FromStream(stream));
                stream = new MemoryStream();
            }
            encoder.OutPut(ref stream);
            HttpContext.Current.Response.ClearContent();
            HttpContext.Current.Response.ContentType = "image/Gif";
            HttpContext.Current.Response.BinaryWrite(stream.ToArray());
            stream.Close();
            stream.Dispose();
        }

        private void CreateValidate()
        {
            this.ValidateCode = "";
            string[] strArray = this.AllChar.Split(new char[] { ',' });
            int index = -1;
            Random random = new Random();
            for (int i = 0; i < this.ValidateCodeCount; i++)
            {
                if (index != -1)
                {
                    random = new Random((i * index) * ((int) DateTime.Now.Ticks));
                }
                int num3 = random.Next(0x23);
                if (index == num3)
                {
                    this.CreateValidate();
                }
                index = num3;
                this.ValidateCode = this.ValidateCode + strArray[index];
            }
            if (this.ValidateCode.Length > this.TrueValidateCodeCount)
            {
                this.ValidateCode = this.ValidateCode.Remove(this.TrueValidateCodeCount);
            }
        }

        private void DisposeImageBmp(ref Bitmap ImageFrame)
        {
            Graphics graphics = Graphics.FromImage(ImageFrame);
            Pen pen = new Pen(this.DrawColor, 1f);
            Random random = new Random();
            Point[] pointArray = new Point[2];
            for (int i = 0; i < 15; i++)
            {
                pointArray[0] = new Point(random.Next(ImageFrame.Width), random.Next(ImageFrame.Height));
                pointArray[1] = new Point(random.Next(ImageFrame.Width), random.Next(ImageFrame.Height));
                graphics.DrawLine(pen, pointArray[0], pointArray[1]);
            }
            graphics.Dispose();
        }

        public void OutPutValidate(string ValidateCodeSession)
        {
            this.CreateValidate();
            this.CreateImageGif();
            HttpContext.Current.Session[ValidateCodeSession] = this.ValidateCode;
        }

        public byte ValidateCodeCount
        {
            get
            {
                return this.TrueValidateCodeCount;
            }
            set
            {
                if (value > 4)
                {
                    this.TrueValidateCodeCount = value;
                }
            }
        }
    }
复制代码

验证码效果:

16aspx下载

本地下载

分享到:
评论

相关推荐

    【ASP.NET编程知识】12306动态验证码启发之ASP.NET实现动态GIF验证码(附源码).docx

    在本文档中,我们探讨了如何使用ASP.NET来实现一个动态GIF验证码的生成,受到了12306网站的动态验证码机制的启发。12306的验证码设计旨在增加安全性,但也因复杂性引起了一些用户的困扰。为了解决这个问题,我们可以...

    ASP.NET动态验证码

    在这个例子中,我们将深入探讨ASP.NET如何实现动态验证码的生成与验证。 首先,我们需要创建一个验证码类,这个类将负责生成随机的字符串和对应的图像。在.NET框架中,我们可以利用`Random`类生成随机数字,然后将...

    ASP.NET GIF动态验证码源码

    ASP.NET GIF动态验证码源码是用于网站安全验证的一种技术,主要目的是防止自动化程序(如机器人)进行非法操作,如批量注册、恶意登录等。在ASP.NET框架中,开发者可以利用C#或VB.NET语言实现这一功能。这个源码是...

    12306动态验证码启发之ASP.NET实现动态GIF验证码(附源码)

    在本文中,我们将探讨如何受到12306动态验证码的启发,在ASP.NET环境中实现一个动态GIF验证码。12306的验证码系统因其复杂性而广为人知,其目的是防止机器人或自动化脚本进行恶意操作,如抢票。在开发过程中,我们...

    asp.net mvc验证码实现

    ASP.NET MVC是一个强大的Web应用程序开发框架,用于构建动态、数据驱动的网站。在这个场景中,我们关注的是在ASP.NET MVC中实现验证码的功能。验证码的主要目的是防止自动机器人或恶意用户进行非法操作,例如垃圾...

    图片数字字母验证码识别asp.net源码

    本项目“图片数字字母验证码识别asp.net源码”提供了C#编程语言实现的验证码识别解决方案,特别适用于ASP.NET web应用程序。接下来,我们将深入探讨这个领域的相关知识点。 首先,验证码识别通常涉及到图像处理和...

    【ASP.NET编程知识】ASP.NET验证码实现(附源码).docx

    "ASP.NET 验证码实现详解" ASP.NET 验证码实现是 ASP.NET 编程中的一种常见技术,用于生成验证码图片,以防止恶意攻击和自动注册。下面将详细介绍 ASP.NET 验证码实现的知识点: 一、验证码生成 在 ASP.NET 中,...

    asp.net短信登录验证码和图片验证程序源码

    资源名:asp.net短信登录验证码和图片验证程序源码 资源类型:程序源代码 源码说明: 1.实现了验证码倒计时的功能 1.以下验证码例子采用的是先获取手机号文字验证码,如果文字验证码收不到,将采用语音播放验证码的...

    asp.net实现验证码功能

    ASP.NET 是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和工具,使得开发者能够高效地创建动态、交互式的网站。在这个特定的场景中,我们关注的是如何在ASP.NET中实现验证码功能,这是一种用于验证...

    c# 验证码源码 asp.net

    在ASP.NET框架下,利用C#编程语言开发验证码源码是一个常用的需求。本篇文章将深入探讨如何在C#与ASP.NET环境下创建一个自定义的验证码系统,并结合提供的文件名,解析其可能包含的关键技术点。 首先,`...

    ASP.NET 实现验证码

    ASP.NET 是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和工具,使得开发者能够高效地构建动态网站、Web服务以及Web应用程序。在ASP.NET中实现验证码是一种常见的安全措施,用于防止自动化程序(如...

    验证码(aps.net源码)

    本资源提供了一套基于C#语言和ASP.NET框架实现的验证码源码,这有助于开发者快速构建自己的验证码功能。 验证码的核心原理是生成一组随机的字符(数字或字母)并以图像形式展示,用户需要输入看到的字符序列以证明...

    ASP.Net实现SQL动态绑定Echarts图表Demo完整源码

    【ASP.Net实现SQL动态绑定Echarts图表Demo完整源码】是一个示例项目,它演示了如何在ASP.Net环境中结合Echarts图表库、C#、SQL和JSON技术来动态展示数据库中的数据。该项目的核心目标是利用后端服务器处理程序获取...

    验证码源码asp.net开发常用

    web常用的验证码,可以跟大家分享,希望大家给予指点,这254693836是我QQ

    验证码(asp.net 加减乘除)

    asp.net 四则混合运算验证码 asp.net 四则混合运算验证码 asp.net 四则混合运算验证码 asp.net 四则混合运算验证码 asp.net 四则混合运算验证码

    验证码 asp.net 各种验证码

    本文将深入探讨ASP.NET中创建和实现各种验证码的方法。 首先,我们要了解ASP.NET验证码的基本原理。验证码通常由服务器生成一个随机的字符串或图像,并将其存储在服务器端的会话(Session)中。客户端在页面加载时...

    asp.net 用WebBrowse控件显示GIF动画源码

    总之,"asp.net 用WebBrowse控件显示GIF动画源码"这个资源为开发者提供了一个实用的方法来在ASP.NET应用中展示动态GIF。通过下载提供的Example033-用WebBrowse控件显示GIF动画示例,你可以深入学习和理解这一功能的...

    Asp.net 验证码控件

    除了传统的图像验证码,还有更多高级的验证手段,如滑动验证码、点击验证点、声音验证码等,这些在Asp.net中也可通过自定义控件或第三方库实现。 **6. 性能优化** 由于生成和验证验证码会增加服务器负载,所以应...

    asp.net生成图形验证码

    通过"图形验证码生成_asp.net"这个项目,开发者可以学习到如何在ASP.NET环境中实现一个完整的图形验证码系统,包括生成、发送、验证和安全防护等多个环节,这些知识对于构建更安全的Web应用非常有价值。

Global site tag (gtag.js) - Google Analytics