验证码类
做项目,重新封装了一个验证码的类,难度不大,可以设置验证码框的宽度和高度,设定背景色,设定字母或是数字,或是混合的,设定验证码是否有边框,设定验证码个数等.有兴趣的朋友还可以增加中文的验证码等,修改请保留原始注释.有问题或有更好的方法请指正,欢迎探讨,谢谢.
Code
using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.Drawing;
using System.IO;
using System.Text;
using System.Web.UI;
namespace FXOA.Utility.ManageUtility
{
/**//// <summary>
/// 作用:验证码生成
/// 创建人:王坤 2009.01.15
/// </summary>
public class ValidateCode
{
私有变量属性#region 私有变量属性
public enum CharacterType { Letter, Number, Admixture, Chinese}
private int _codelength = 5;
private Color _backgroudcolor = Color.White;
private int _bmpwidth = 100;
private int _bmpheigth = 25;
private bool _border = false;
private CharacterType _chartype = CharacterType.Admixture;
private string[] _admixturechar = { "2", "3", "4", "5", "6", "8", "9",
"A", "B", "C", "D", "E", "F", "G", "H", "J", "K",
"L", "M", "N", "P", "R", "S", "T", "W", "X", "Y",
"a", "b", "c", "d", "e", "f", "g", "h", "j", "k",
"l", "m", "n", "p", "r", "s", "t", "w", "x", "y" };
private string[] _letterchar = {"A", "B", "C", "D", "E", "F", "G", "H", "J", "K",
"L", "M", "N", "P", "R", "S", "T", "W", "X", "Y",
"a", "b", "c", "d", "e", "f", "g", "h", "j", "k",
"l", "m", "n", "p", "r", "s", "t", "w", "x", "y" };
private string[] _numberchar = {"1", "2", "3", "4", "5", "6", "8", "9", "0" };
// private string _chinesechar = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严";
private Color[] _colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green,
Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
private string[] _fonts = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh",
"Arial", "Georgia", "PMingLiU", "Impact" };
/**//// <summary>
/// 随机码长度(默认值为5)
/// </summary>
public int CodeLength
{
get { return this._codelength; }
set { this._codelength = value; }
}
/**//// <summary>
/// Graphics背景色(默认为白色)
/// </summary>
public Color BackGroudColor
{
get { return this._backgroudcolor; }
set { this._backgroudcolor = value; }
}
/**//// <summary>
/// 随机码图片宽度(默认值100)
/// </summary>
public int BmpWidth
{
get { return this._bmpwidth; }
set { this._bmpwidth = value; }
}
/**//// <summary>
/// 随机码图片高度(默认值25)
/// </summary>
public int BmpHeigth
{
get { return this._bmpheigth; }
set { this._bmpheigth = value; }
}
/**//// <summary>
/// 是否画边框(默认值false)
/// </summary>
public bool Border
{
get { return this._border; }
set { this._border = value; }
}
/**//// <summary>
/// 字符集(默认值是字幕和数字混合体)
/// </summary>
public CharacterType CharType
{
get { return this._chartype; }
set { this._chartype = value; }
}
/**//// <summary>
/// 混合随机字符
/// </summary>
private string[] AdmixtureChar
{
get { return this._admixturechar; }
set { this._letterchar = value;}
}
/**//// <summary>
/// 字母随机字符
/// </summary>
private string[] LetterChar
{
get { return this._letterchar; }
set { this._letterchar = value; }
}
/**//// <summary>
/// 数字随机字符
/// </summary>
private string[] NumberChar
{
get { return this._numberchar; }
set { this._numberchar = value; }
}
/**//// <summary>
/// 随机颜色
/// </summary>
private Color[] Colors
{
get { return this._colors; }
set { this._colors = value; }
}
/**//// <summary>
/// 随机字体
/// </summary>
private string[] Fonts
{
get { return this._fonts; }
set { this._fonts = value; }
}
#endregion
构造函数#region 构造函数
/**//// <summary>
/// 构造函数
/// </summary>
public ValidateCode() { }
#endregion
验证码方法函数#region 验证码方法函数
/**//// <summary>
/// 创建随机码
/// </summary>
/// <returns>string</returns>
public string CreateCode()
{
string CodeNumber = string.Empty;
Random rdm = new Random();
for (int i = 0; i < CodeLength; i++)
{
//判断字符集
switch (CharType)
{
case CharacterType.Admixture:
CodeNumber += AdmixtureChar[rdm.Next(AdmixtureChar.Length)];
break;
case CharacterType.Letter:
CodeNumber += LetterChar[rdm.Next(LetterChar.Length)];
break;
case CharacterType.Number:
CodeNumber += NumberChar[rdm.Next(NumberChar.Length)];
break;
}
}
return CodeNumber;
}
/**//// <summary>
/// 创建随机码输出
/// </summary>
/// <param name="codeNumber">动态随机码</param>
/// <param name="page">当前页面</param>
public void CreateValidateCode(string codeNumber, Page page)
{
MemoryStream ms = new MemoryStream();
Bitmap bmpImage = CreateImage(codeNumber);
try
{
bmpImage.Save(ms, ImageFormat.Jpeg);
page.Response.ClearContent();
page.Response.ContentType = "image/Jpeg";
page.Response.BinaryWrite(ms.GetBuffer());
}
catch
{
ms.Dispose();
bmpImage.Dispose();
}
}
/**//// <summary>
/// 创建随机码图片(私有函数)
/// </summary>
/// <param name="codeNumber">动态随机码</param>
/// <returns>Bitmap</returns>
private Bitmap CreateImage(string codeNumber)
{
Bitmap bmp = new Bitmap(BmpWidth, BmpHeigth);
Graphics grh = Graphics.FromImage(bmp);
Random rdm = new Random();
grh.Clear(BackGroudColor);
Color penColor = Colors[rdm.Next(Colors.Length)]; //随机产生颜色
Pen pen = new Pen(penColor);
for (int i = 0; i < CodeLength*5; i++)
{
int x = rdm.Next(bmp.Width);
int y = rdm.Next(bmp.Height);
grh.DrawRectangle(pen, x, y, 1, 1); //画一个矩形方框
}
for (int i = 0; i < CodeLength; i++)
{
int sWidth = i*(BmpWidth / CodeLength) + 1; //根据宽度和长度设定随机码在画板中的显示位置
int sHeigth = BmpHeigth / 2 - 10;
Brush brh = new SolidBrush(Colors[rdm.Next(Colors.Length)]);
Font fnt = new Font(Fonts[rdm.Next(Fonts.Length)], 15, FontStyle.Bold);
grh.DrawString(codeNumber[i].ToString(), fnt, brh, sWidth, sHeigth);
}
if (Border) //是否有边框
{
grh.DrawRectangle(pen, 0, 0, bmp.Width - 1, bmp.Height - 1); //为随机码添加一个边框
}
grh.Dispose();
return bmp;
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.Drawing;
using System.IO;
using System.Text;
using System.Web.UI;
namespace FXOA.Utility.ManageUtility
{
/**//// <summary>
/// 作用:验证码生成
/// 创建人:王坤 2009.01.15
/// </summary>
public class ValidateCode
{
私有变量属性#region 私有变量属性
public enum CharacterType { Letter, Number, Admixture, Chinese}
private int _codelength = 5;
private Color _backgroudcolor = Color.White;
private int _bmpwidth = 100;
private int _bmpheigth = 25;
private bool _border = false;
private CharacterType _chartype = CharacterType.Admixture;
private string[] _admixturechar = { "2", "3", "4", "5", "6", "8", "9",
"A", "B", "C", "D", "E", "F", "G", "H", "J", "K",
"L", "M", "N", "P", "R", "S", "T", "W", "X", "Y",
"a", "b", "c", "d", "e", "f", "g", "h", "j", "k",
"l", "m", "n", "p", "r", "s", "t", "w", "x", "y" };
private string[] _letterchar = {"A", "B", "C", "D", "E", "F", "G", "H", "J", "K",
"L", "M", "N", "P", "R", "S", "T", "W", "X", "Y",
"a", "b", "c", "d", "e", "f", "g", "h", "j", "k",
"l", "m", "n", "p", "r", "s", "t", "w", "x", "y" };
private string[] _numberchar = {"1", "2", "3", "4", "5", "6", "8", "9", "0" };
// private string _chinesechar = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严";
private Color[] _colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green,
Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
private string[] _fonts = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh",
"Arial", "Georgia", "PMingLiU", "Impact" };
/**//// <summary>
/// 随机码长度(默认值为5)
/// </summary>
public int CodeLength
{
get { return this._codelength; }
set { this._codelength = value; }
}
/**//// <summary>
/// Graphics背景色(默认为白色)
/// </summary>
public Color BackGroudColor
{
get { return this._backgroudcolor; }
set { this._backgroudcolor = value; }
}
/**//// <summary>
/// 随机码图片宽度(默认值100)
/// </summary>
public int BmpWidth
{
get { return this._bmpwidth; }
set { this._bmpwidth = value; }
}
/**//// <summary>
/// 随机码图片高度(默认值25)
/// </summary>
public int BmpHeigth
{
get { return this._bmpheigth; }
set { this._bmpheigth = value; }
}
/**//// <summary>
/// 是否画边框(默认值false)
/// </summary>
public bool Border
{
get { return this._border; }
set { this._border = value; }
}
/**//// <summary>
/// 字符集(默认值是字幕和数字混合体)
/// </summary>
public CharacterType CharType
{
get { return this._chartype; }
set { this._chartype = value; }
}
/**//// <summary>
/// 混合随机字符
/// </summary>
private string[] AdmixtureChar
{
get { return this._admixturechar; }
set { this._letterchar = value;}
}
/**//// <summary>
/// 字母随机字符
/// </summary>
private string[] LetterChar
{
get { return this._letterchar; }
set { this._letterchar = value; }
}
/**//// <summary>
/// 数字随机字符
/// </summary>
private string[] NumberChar
{
get { return this._numberchar; }
set { this._numberchar = value; }
}
/**//// <summary>
/// 随机颜色
/// </summary>
private Color[] Colors
{
get { return this._colors; }
set { this._colors = value; }
}
/**//// <summary>
/// 随机字体
/// </summary>
private string[] Fonts
{
get { return this._fonts; }
set { this._fonts = value; }
}
#endregion
构造函数#region 构造函数
/**//// <summary>
/// 构造函数
/// </summary>
public ValidateCode() { }
#endregion
验证码方法函数#region 验证码方法函数
/**//// <summary>
/// 创建随机码
/// </summary>
/// <returns>string</returns>
public string CreateCode()
{
string CodeNumber = string.Empty;
Random rdm = new Random();
for (int i = 0; i < CodeLength; i++)
{
//判断字符集
switch (CharType)
{
case CharacterType.Admixture:
CodeNumber += AdmixtureChar[rdm.Next(AdmixtureChar.Length)];
break;
case CharacterType.Letter:
CodeNumber += LetterChar[rdm.Next(LetterChar.Length)];
break;
case CharacterType.Number:
CodeNumber += NumberChar[rdm.Next(NumberChar.Length)];
break;
}
}
return CodeNumber;
}
/**//// <summary>
/// 创建随机码输出
/// </summary>
/// <param name="codeNumber">动态随机码</param>
/// <param name="page">当前页面</param>
public void CreateValidateCode(string codeNumber, Page page)
{
MemoryStream ms = new MemoryStream();
Bitmap bmpImage = CreateImage(codeNumber);
try
{
bmpImage.Save(ms, ImageFormat.Jpeg);
page.Response.ClearContent();
page.Response.ContentType = "image/Jpeg";
page.Response.BinaryWrite(ms.GetBuffer());
}
catch
{
ms.Dispose();
bmpImage.Dispose();
}
}
/**//// <summary>
/// 创建随机码图片(私有函数)
/// </summary>
/// <param name="codeNumber">动态随机码</param>
/// <returns>Bitmap</returns>
private Bitmap CreateImage(string codeNumber)
{
Bitmap bmp = new Bitmap(BmpWidth, BmpHeigth);
Graphics grh = Graphics.FromImage(bmp);
Random rdm = new Random();
grh.Clear(BackGroudColor);
Color penColor = Colors[rdm.Next(Colors.Length)]; //随机产生颜色
Pen pen = new Pen(penColor);
for (int i = 0; i < CodeLength*5; i++)
{
int x = rdm.Next(bmp.Width);
int y = rdm.Next(bmp.Height);
grh.DrawRectangle(pen, x, y, 1, 1); //画一个矩形方框
}
for (int i = 0; i < CodeLength; i++)
{
int sWidth = i*(BmpWidth / CodeLength) + 1; //根据宽度和长度设定随机码在画板中的显示位置
int sHeigth = BmpHeigth / 2 - 10;
Brush brh = new SolidBrush(Colors[rdm.Next(Colors.Length)]);
Font fnt = new Font(Fonts[rdm.Next(Fonts.Length)], 15, FontStyle.Bold);
grh.DrawString(codeNumber[i].ToString(), fnt, brh, sWidth, sHeigth);
}
if (Border) //是否有边框
{
grh.DrawRectangle(pen, 0, 0, bmp.Width - 1, bmp.Height - 1); //为随机码添加一个边框
}
grh.Dispose();
return bmp;
}
#endregion
}
}
使用方法:新建一个验证码页面vaildatecode.aspx
Code
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using FXOA.Utility.ManageUtility;
public partial class ManageUI_ValidateCode : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ValidateCode vc = new ValidateCode();
string validateCode = vc.CreateCode();
Session["Code"] = validateCode.Trim().ToUpper();//将所有字母转换为大写
vc.CreateValidateCode(validateCode, this.Page);
}
}
}
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using FXOA.Utility.ManageUtility;
public partial class ManageUI_ValidateCode : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ValidateCode vc = new ValidateCode();
string validateCode = vc.CreateCode();
Session["Code"] = validateCode.Trim().ToUpper();//将所有字母转换为大写
vc.CreateValidateCode(validateCode, this.Page);
}
}
}
调用页面加上
Code
<span>
<img runat="server" id="imgcode" src="~/validatecode.aspx" alt="验证码看不清楚,请重新获取" /></span>
<span><a style="cursor: pointer; vertical-align: top" title="重新获取(字母不区分大小写)" onclick="document.getElementById('imgcode').src='validatecode.aspx?' + Math.random()">
重新获取</a></span>
<span>
<img runat="server" id="imgcode" src="~/validatecode.aspx" alt="验证码看不清楚,请重新获取" /></span>
<span><a style="cursor: pointer; vertical-align: top" title="重新获取(字母不区分大小写)" onclick="document.getElementById('imgcode').src='validatecode.aspx?' + Math.random()">
重新获取</a></span>