背景:
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来实现一个动态GIF验证码的生成,受到了12306网站的动态验证码机制的启发。12306的验证码设计旨在增加安全性,但也因复杂性引起了一些用户的困扰。为了解决这个问题,我们可以...
在这个例子中,我们将深入探讨ASP.NET如何实现动态验证码的生成与验证。 首先,我们需要创建一个验证码类,这个类将负责生成随机的字符串和对应的图像。在.NET框架中,我们可以利用`Random`类生成随机数字,然后将...
ASP.NET GIF动态验证码源码是用于网站安全验证的一种技术,主要目的是防止自动化程序(如机器人)进行非法操作,如批量注册、恶意登录等。在ASP.NET框架中,开发者可以利用C#或VB.NET语言实现这一功能。这个源码是...
ASP.NET MVC是一个强大的Web应用程序开发框架,用于构建动态、数据驱动的网站。在这个场景中,我们关注的是在ASP.NET MVC中实现验证码的功能。验证码的主要目的是防止自动机器人或恶意用户进行非法操作,例如垃圾...
本项目“图片数字字母验证码识别asp.net源码”提供了C#编程语言实现的验证码识别解决方案,特别适用于ASP.NET web应用程序。接下来,我们将深入探讨这个领域的相关知识点。 首先,验证码识别通常涉及到图像处理和...
在本文中,我们将探讨如何受到12306动态验证码的启发,在ASP.NET环境中实现一个动态GIF验证码。12306的验证码系统因其复杂性而广为人知,其目的是防止机器人或自动化脚本进行恶意操作,如抢票。在开发过程中,我们...
asp.net 四则混合运算验证码 asp.net 四则混合运算验证码 asp.net 四则混合运算验证码 asp.net 四则混合运算验证码 asp.net 四则混合运算验证码
"ASP.NET 验证码实现详解" ASP.NET 验证码实现是 ASP.NET 编程中的一种常见技术,用于生成验证码图片,以防止恶意攻击和自动注册。下面将详细介绍 ASP.NET 验证码实现的知识点: 一、验证码生成 在 ASP.NET 中,...
资源名:asp.net短信登录验证码和图片验证程序源码 资源类型:程序源代码 源码说明: 1.实现了验证码倒计时的功能 1.以下验证码例子采用的是先获取手机号文字验证码,如果文字验证码收不到,将采用语音播放验证码的...
ASP.NET 是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和工具,使得开发者能够高效地创建动态、交互式的网站。在这个特定的场景中,我们关注的是如何在ASP.NET中实现验证码功能,这是一种用于验证...
在ASP.NET框架下,利用C#编程语言开发验证码源码是一个常用的需求。本篇文章将深入探讨如何在C#与ASP.NET环境下创建一个自定义的验证码系统,并结合提供的文件名,解析其可能包含的关键技术点。 首先,`...
ASP.NET 是微软开发的一种用于构建Web应用程序的框架,它提供了丰富的功能和工具,使得开发者能够高效地构建动态网站、Web服务以及Web应用程序。在ASP.NET中实现验证码是一种常见的安全措施,用于防止自动化程序(如...
【ASP.Net实现SQL动态绑定Echarts图表Demo完整源码】是一个示例项目,它演示了如何在ASP.Net环境中结合Echarts图表库、C#、SQL和JSON技术来动态展示数据库中的数据。该项目的核心目标是利用后端服务器处理程序获取...
本资源提供了一套基于C#语言和ASP.NET框架实现的验证码源码,这有助于开发者快速构建自己的验证码功能。 验证码的核心原理是生成一组随机的字符(数字或字母)并以图像形式展示,用户需要输入看到的字符序列以证明...
web常用的验证码,可以跟大家分享,希望大家给予指点,这254693836是我QQ
本文将深入探讨ASP.NET中创建和实现各种验证码的方法。 首先,我们要了解ASP.NET验证码的基本原理。验证码通常由服务器生成一个随机的字符串或图像,并将其存储在服务器端的会话(Session)中。客户端在页面加载时...
总之,"asp.net 用WebBrowse控件显示GIF动画源码"这个资源为开发者提供了一个实用的方法来在ASP.NET应用中展示动态GIF。通过下载提供的Example033-用WebBrowse控件显示GIF动画示例,你可以深入学习和理解这一功能的...
除了传统的图像验证码,还有更多高级的验证手段,如滑动验证码、点击验证点、声音验证码等,这些在Asp.net中也可通过自定义控件或第三方库实现。 **6. 性能优化** 由于生成和验证验证码会增加服务器负载,所以应...
通过"图形验证码生成_asp.net"这个项目,开发者可以学习到如何在ASP.NET环境中实现一个完整的图形验证码系统,包括生成、发送、验证和安全防护等多个环节,这些知识对于构建更安全的Web应用非常有价值。