介紹生成兩種類型的圖形驗證碼: 1.普通的隨機字符串; 2.隨機運算表達式
圖形驗證碼類:
/// <summary>
/// 圖形驗證碼類
/// </summary>
public class PicCaptcha
{
#region Constructed Methods
/// <summary>
/// 默認構造方法
/// </summary>
public PicCaptcha()
{
}
/// <summary>
///構造方法
/// </summary>
/// <param name="cpatchaType">驗證碼類型</param>
public PicCaptcha(CaptchaType cpatchaType)
{
this.CaptchaType = cpatchaType;
}
/// <summary>
/// 構造方法
/// </summary>
/// <param name="captchaType">驗證碼類型</param>
/// <param name="width">圖形寬度</param>
/// <param name="height">圖形高度</param>
public PicCaptcha(CaptchaType captchaType, int width, int height)
: this(captchaType)
{
this.Width = width;
this.Height = height;
}
/// <summary>
/// 構造方法
/// </summary>
/// <param name="captchaType">驗證碼類型</param>
/// <param name="width">圖形寬度</param>
/// <param name="height">圖形高度</param>
/// <param name="fontSize">字體大小</param>
public PicCaptcha(CaptchaType captchaType, int width, int height, int fontSize)
: this(captchaType, width, height)
{
this.FontSize = fontSize;
}
#endregion
#region Fields
private int _width = 80; //default width
private int _height = 25; //default height
private int _fontSize = 16; //default fontSize
private CaptchaType _captchaType = CaptchaType.RandomType; //default captchaType
#endregion
#region Properties
/// <summary>
/// 驗證碼圖形寬度
/// </summary>
public int Width
{
get { return _width; }
set { _width = value; }
}
/// <summary>
/// 驗證碼圖形高度
/// </summary>
public int Height
{
get { return _height; }
set { _height = value; }
}
/// <summary>
/// 驗證碼字體大小
/// </summary>
public int FontSize
{
get { return _fontSize; }
set { _fontSize = value; }
}
/// <summary>
/// 驗證碼類型
/// </summary>
public CaptchaType CaptchaType
{
get { return _captchaType; }
set { _captchaType = value; }
}
#endregion
#region Public Methods
/// <summary>
/// 獲取生成的驗證碼圖片
/// </summary>
/// <param name="matchCode">與驗證碼圖片相匹配的內容,一般將該內容保存至session中,用於校驗</param>
/// <returns>驗證碼圖片</returns>
public Bitmap GetCaptchaPic(out string matchCode)
{
matchCode = null;
string captchaContent = null;
switch (_captchaType) //需要生成的驗證碼類型
{
case CaptchaType.RandomString:
{
string randomStr = CreateCheckCodeString(4);
captchaContent = randomStr;
matchCode = randomStr;
break;
}
case CaptchaType.RandomOperationExpression:
{
string[] codes = CreateOperateCheckCode();
captchaContent = codes[0];
matchCode = codes[1];
break;
}
case CaptchaType.RandomType:
{
RandomSelectCreateMethod(out captchaContent, out matchCode);
break;
}
default:
throw new Exception("unknow CaptchaType!");
}
return GenerateCaptchaPic(captchaContent); //生成驗證碼圖片
}
#endregion
#region Private Methods
/// <summary>
/// 生成驗證碼圖片
/// </summary>
/// <param name="captchaContent">驗證碼內容</param>
/// <returns>圖片</returns>
private Bitmap GenerateCaptchaPic(string captchaContent)
{
var font = new Font("Arial", _fontSize, FontStyle.Bold);//驗證碼字體
var brush = new SolidBrush(Color.Black);//用於寫驗證碼的畫筆
var crosswise = new Pen(Color.Green, 0);//畫橫向干擾線的鋼筆
var vertical = new Pen(Color.FromArgb(255, 100, 100, 100), 0);//畫縱向干擾線的鋼筆
var image = new Bitmap(_width, _height);//生成圖像
using (Graphics g = Graphics.FromImage(image)) //生成一個繪畫面板(畫布)
{
g.Clear(ColorTranslator.FromHtml("#f0f0f0"));//用指定顏色填充畫布
RectangleF rect = new RectangleF(5, 2, _width, _height);//定義文字的繪制矩形
Random rand = new Random((int)DateTime.Now.Ticks);//生成干擾線的隨機對象
for (int i = 1; i <= 4; i++) //干擾線
{
Point start = new Point(0, rand.Next(_height));
Point end = new Point(_width, rand.Next(_height));
g.DrawLine(crosswise, start, end);
}
for (int i = 1; i <= 5; i++) //干擾線
{
Point start = new Point(rand.Next(_width), 0);
Point end = new Point(rand.Next(_width), _height);
g.DrawLine(vertical, start, end);
}
g.DrawString(captchaContent, font, brush, rect);//將驗證碼寫到畫布上
}
return image;
}
/// <summary>
/// 隨機選擇生成驗證碼的方法
/// </summary>
/// <param name="captchaContent">驗證碼圖片顯示的內容</param>
/// <param name="matchCode">與驗證碼圖片匹配的內容</param>
private void RandomSelectCreateMethod(out string captchaContent, out string matchCode)
{
captchaContent = "";
matchCode = "";
int currSeconds = DateTime.Now.Second;
if (currSeconds % 2 == 0)
{
captchaContent = matchCode = CreateCheckCodeString(4);
}
else
{
string[] codes = CreateOperateCheckCode();
captchaContent = codes[0];
matchCode = codes[1];
}
return;
}
/// <summary>
/// 生成len位隨機字符串
/// </summary>
/// <param name="len">隨機字符串長度</param>
/// <returns>len位隨機字符串</returns>
private string CreateCheckCodeString(int len)
{
//定義用於驗證碼的字符數組
char[] checkCodeArray ={ '1','2','3','4','5','6','7','8','9','A','B','C',
'D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W',
'X','Y','Z'};
//定義驗證碼字符串
string randomcode = "";
Random rd = new Random();
//生成4位驗證碼字符串
for (int i = 1; i <= len; i++)
randomcode += checkCodeArray[rd.Next(checkCodeArray.Length)];
return randomcode;
}
/// <summary>
/// 生成隨機的運算表達式 1+1=?,2
/// </summary>
/// <returns>codes[0]: 表達式; codes[1]: 運算結果</returns>
private string[] CreateOperateCheckCode()
{
string[] codes = new string[2] { "", "" };
string[] operators = new string[] { "+", "-" };
int result = 0;
Random random = new Random();
int num1 = random.Next(10); // [0,19)
int num2 = random.Next(10);
string oper = operators[random.Next(operators.Length)];
switch (oper)
{
case "+":
{
result = num1 + num2;
break;
}
case "-":
{
result = num1 - num2;
break;
}
default:
throw new Exception("operators error");
}
codes[0] = string.Format("{0}{1}{2}=?", num1, oper, num2);
codes[1] = result.ToString();
return codes;
}
#endregion
}
/// <summary>
/// 生成的驗證碼類型
/// </summary>
public enum CaptchaType
{
/// <summary>
/// 隨機類型, 在所有支持的驗證碼類型中,隨機選擇一種
/// </summary>
RandomType,
/// <summary>
/// 普通的隨機字符串,如: jH9Y, 12H8
/// </summary>
RandomString,
/// <summary>
/// 隨機運算表達式, 如: 1+2=?, 5加2=?, 4-2=?
/// </summary>
RandomOperationExpression,
}
一般處理程序(.ashx)示例:
/// <summary>
/// 生成圖形驗證碼
/// </summary>
public class CreateCode : IHttpHandler, IRequiresSessionState
{
private static readonly string CodeSessionName = "Code_Session_Name";
public void ProcessRequest(HttpContext context)
{
string checkCodeSession = string.Empty;
var captChaPic = new PicCaptcha();
using (var image = captChaPic.GetCaptchaPic(out checkCodeSession)) //獲取驗證碼圖片
using (var ms = new MemoryStream())
{
context.Session.Add(CodeSessionName, checkCodeSession); //驗證碼校驗內容保存到sessioin中
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
context.Response.ClearContent();
context.Response.ContentType = "image/Gif";
context.Response.BinaryWrite(ms.ToArray());
}
return;
}
public bool IsReusable
{
get
{
return false;
}
}
}
下載:
