网站在进行重要操作步骤时,为了防止攻击,一般都采用生成验证码的方法。为了使用方便,我自己写了一个从BaseValidator实现的验证控件,负责给指定的Image控制设置ImageSrc并在验证失败时,清空TextBox控制的值。从BaseValidator继承,是因为服务端只需调用
就可以了。
下面主要代码公布如下,希望大家拍砖。
使用代码示例:
<asp:TextBox ID="TextBox1" runat="server" AutoCompleteType="Disabled" ></asp:TextBox>
<asp:Image ID="Image1" runat="server" ImageAlign="absMiddle" />
<asp:ImageValidator runat="server" ID="imagevalidator"
ImageControl="Image1"
ControlToValidate="TextBox1"
Display="Dynamic"
CharCount="4"
Fonts="宋体,Gungsuh,仿宋,黑体"
BgColor="White"
MaxFontSize="16"
MinFontSizePercent="50"
ErrorMessage="验证码错误!"
SetFocusOnError="True" />

后台编码:
protected void OnLogin(object sender, EventArgs e)

{
try

{
if (Page.IsValid)

{
string hashedPwd = Utility.Md5.HashedString(this.tbLoginPassword.Text.Trim());
Manager manager = Manager.CreateInstance(this.tbLoginName.Text.Trim(), hashedPwd);
//登陆成功
ManagePageBase.SetAuthSession(manager);
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(manager.Name, false);
}
}
catch (BusinessException ex)

{
this.ShowMessage(ex.Message);
}
}

实现代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.ComponentModel;
using System.Web.Configuration;
using System.Drawing.Design;
using System.Drawing;
using System.Web.SessionState;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace Iyond.Web.UI.WebControls


{
public class ImageValidator : System.Web.UI.WebControls.BaseValidator

{

private string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
[Bindable(false)]
[Category("Data")]
[DefaultValue("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")]
[Localizable(true)]
[Description("用于生成验证码的源字符")]
public string Chars

{
get

{
return _chars;
}

set

{
_chars = value;
}
}

private int _charCount = 5;
[Bindable(false)]
[Category("Data")]
[DefaultValue(5)]
[Localizable(true)]
[Description("验证码中字符的数量")]
public int CharCount

{
get

{
return _charCount;
}
set

{
_charCount = value;
}
}

private string _pageValidateCode = "~/IyondValidateCode.aspx";
[Category("Data")]
[Localizable(true)]
[Description("在Web.config中的HttpHandler节中配置的读取验证码的页面")]
public string ValidateCodePage

{

get
{ return _pageValidateCode; }

set
{ _pageValidateCode = value; }
}


private int _minFontSizePercent = 60;
[Category("Data")]
[Localizable(true)]
[Description("字体最小高度占Image控件高度的百分比")]
public int MinFontSizePercent

{
get

{
return _minFontSizePercent;
}
set

{
if (value > 100)
throw new ArgumentOutOfRangeException("MaxFontSize", value, "最大为100(表示100%)");
if (value < 50)
throw new ArgumentOutOfRangeException("MaxFontSize", value, "最小为50(表示50%)");

_minFontSizePercent = value;
}
}


public int MinFontSize

{
get

{
return Convert.ToInt32(this.MaxFontSize * this.MinFontSizePercent / 100 + 1);
}
}

private int _maxFontSize = 100;
[Category("Data")]
[Localizable(true)]
[Description("字体最大高度占Image控件高度的百分比")]
public int MaxFontSize

{
get

{
return _maxFontSize;
}
set

{
if (value > 100)
throw new ArgumentOutOfRangeException("MaxFontSize", value, "最大为100");
if (value < 6)
throw new ArgumentOutOfRangeException("MaxFontSize", value, "最小为6");
_maxFontSize = value;
}
}

private Color _fontColor = Color.Black;
[Category("Data")]
[Localizable(true)]
[Description("字体颜色")]
public Color FontColor

{
get

{
return _fontColor;
}
set

{
_fontColor = value;
}
}

private Color _bgColor = Color.White;
[Category("Data")]
[Localizable(true)]
[Description("字体颜色")]
public Color BgColor

{
get

{
return _bgColor;
}
set

{
_bgColor = value;
}
}

private bool _ignoreCase = true;
[Category("Data")]
[Localizable(true)]
[Description("是否乎略大小写")]
public bool IgnoreCase

{

get
{ return _ignoreCase; }

set
{ _ignoreCase = value; }
}

private bool _enableChangeImage = true;
[Category("Data")]
[Localizable(true)]
[Description("是否允许更换图片")]
public bool EnableChangeImage

{

get
{ return _enableChangeImage; }

set
{ _enableChangeImage = value; }
}

private int _maxRotate = 45;
[Category("Data")]
[Localizable(true)]
[Description("每个字的最大旋转角度")]
public int MaxRotate

{

get
{ return _maxRotate; }

set
{ _maxRotate = value; }
}

private List<string> _fonts = new List<string>();
[Category("Data")]
[Localizable(true)]
[Description("字体列表,从中随机选择")]
[Editor("System.Windows.Forms.Design.StringArrayEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
typeof(UITypeEditor)), TypeConverter(typeof(FontNamesConverter)),
RefreshProperties(RefreshProperties.Repaint),
NotifyParentProperty(true)]
public string[] Fonts

{
get

{
return _fonts.ToArray();
}
set

{
if (value == null)
throw new ArgumentNullException("Fonts");

_fonts.Clear();
_fonts.AddRange(value);
}
}



private static Dictionary<string, ImageValidatorConfig> runtimeConfig = new Dictionary<string, ImageValidatorConfig>();


/**//// <summary>
/// 查询验证码配置
/// </summary>
/// <param name="sign">验证码标识</param>
/// <returns></returns>
public static ImageValidatorConfig GetConfig(string sign)

{
if (!runtimeConfig.ContainsKey(sign))
throw new ArgumentOutOfRangeException("sign", sign);

return runtimeConfig[sign] as ImageValidatorConfig;
}



/**//// <summary>
/// 计算是不是合法(验证码是不是正确)
/// </summary>
/// <returns></returns>
protected override bool EvaluateIsValid()

{
bool isValid = false;
string text1 = base.GetControlValidationValue(base.ControlToValidate);
if ((text1 == null) || (text1.Trim().Length == 0))

{
isValid = false;
}
else

{