先创建ValidateCode类库
ValidateCode类
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Drawing;//为程序集添加引用 System.Drawing
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Web;//为程序集添加引用 System.Web
先创建ValidateCode类库
ValidateCode类
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Drawing;//为程序集添加引用 System.Drawing
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Web;//为程序集添加引用 System.Web
namespace ASPNETAJAXWeb.ValidateCode.Page
{
public class ValidateCode:System.Web.UI.Page//继承自System.Web.UI.Page
{
private const double imageLengthBase = 12.5;
private const int imageHeigth = 22;//验证码图片的高度
private const int imageLineNumber = 25;//图片干扰线的数目
private const int imagePointNumber = 100;
public static string validateCodeKey = "validateCodeKey";
private int length = 4;//获取和设置验证码的长度,即验证码的字符的数量
private string code = string.Empty;//获取验证码
/**//// <summary>
/// 获取或设置验证码的长度,默认值为4
/// </summary>
public int Length
{
get { return length; }
set { length = value; }
}
/**//// <summary>
/// 获取验证码
/// </summary>
public string Code
{
get { return code; }
set { code = value; }
}
public ValidateCode()
{
}
/**//// <summary>
/// 创建随机验证码
/// </summary>
/// <param name="length">验证码长度</param>
/// <returns>返回验证码code</returns>
public string createCode(int length)
{
if (length <= 0) return string.Empty;
//创建一组随机数,用来创建验证码
Random random = new Random();
StringBuilder newCode = new StringBuilder();
for (int i = 0; i < length; i++)
{
newCode.Append(random.Next(0, 10));
}
//保存验证码到Session对象中
code = newCode.ToString();
Session[validateCodeKey] = code;
return code;
}
/**//// <summary>
/// 创建验证码的图片和验证码
/// </summary>
/// <param name="code">验证码</param>
public void createValidateImage(string code)
{
if (string.IsNullOrEmpty(code) == true)
return;
//保存验证码到Session对象中
Session[validateCodeKey] = code;
//创建一个图象
Bitmap image = new Bitmap((int)Math.Ceiling((code.Length*imageLengthBase)),imageHeigth);
Graphics graphic = Graphics.FromImage(image);
Random random = new Random();
try
{
graphic.Clear(Color.White);//清空图象,并指定填充颜色
//绘制图片的干扰线
int x1, x2, y1, y2;
for (int i = 0; i < imageLineNumber; i++)
{
x1 = random.Next(image.Width);
y1 = random.Next(image.Height);
x2 = random.Next(image.Width);
y2 = random.Next(image.Height);
//绘制干扰线
graphic.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
//绘制验证码
Font font = new Font("Tahoma", 12, FontStyle.Bold | FontStyle.Italic);
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
graphic.DrawString(code, font, brush, 2.0f, 2.0f);
}
//绘制图片的前景噪音点
int x, y;
for (int i = 0; i < imageLineNumber; i++)
{
x = random.Next(image.Width);
y = random.Next(image.Height);
//绘制点
image.SetPixel(x, y, Color.FromArgb(random.Next()));
//画图片的边框线
graphic.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
//保存图片的内容到流中
MemoryStream ms = new MemoryStream();
image.Save(ms, ImageFormat.Gif);
//输出图片
System.Web.HttpContext.Current.Response.ClearContent();
System.Web.HttpContext.Current.Response.ContentType = "image/Gif";
System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray());
//直接用Response对象会导致引用页面出现“响应在此上下文中不可用”的错误
}
}
finally
{
graphic.Dispose();
image.Dispose();
}
}
/**//// <summary>
/// 重载System.Web.UI.Page类中的Onload(EventArgs e)事件
/// </summary>
/// <param name="e"></param>
protected override void OnLoad(EventArgs e)
{
createValidateImage(length);
}
/**//// <summary>
/// 公开的createValidateImage(int length)方法,可以根据指定长度创建验证码(利用方法的多态性,不同的参数)
/// </summary>
/// <param name="length"></param>
public void createValidateImage(int length)
{
code = createCode(length);
createValidateImage(code);
}
}
}
生成类库后,在Web应用程序中新建Web页面ValidateCode.aspx
<%@ Page Language="C#"AutoEventWireup="false"
Inherits="ValidateCodeClassLibrary.ValidateCode" %> //ValidateCodeClassLibrary为生成的类库名
PS:页面只保留Page的设置,其他都可以删除,包括代码隐藏页。
最后在要验证的Web页面中添加一个<asp:Image>控件
<asp:Image ID="Image_ValidateCode" runat="server" ImageUrl="~/ValidateCode.aspx" />
ImageUrl指向上面所创建的Web页面。
在需要验证的Web页的代码隐藏页中添加引用:
using ValidateCodeClassLibrary;//生成的类库名
在验证事件中判断输入是否与验证码相等:
if (Session[ValidateCode.validateCodeKey] == null) return;
if (TB_ValidateCode.Text.Trim() != Session[ValidateCode.validateCodeKey].ToString())
{
验证码不相等的处理
}
else
{
验证码通过,执行相应事件
}
注意:判断验证码不能在页面的Page_Load或其他初始化的过程中,因为验证码是通过重载OnLoad事件生成的,所以
初始化的事件中验证码的Session是后生成的.这个还有待研究???