热门文章
阿标在线 动力3.62HTML生成3.62网站文件说明
动力3.62整合动网7.0 SP2插
MDAC2.8 下载!
动力3.62版 防止垃圾留言
动力3.6全方位改动方法
让3.62不同频道实现不同风
把3.62首页登陆为横向代码
动易3.6首页随机FLASH修改
362首页和文章频道页图文幻
个性化修改3.6宝典
3.62轻易实现网摘功能
如何正确统计中文字数?
弹出JAVASCRIPT语法错误对
后台使“网站顶部LOGO地址
最新图片文章横向移动的修
html 生成艺术字
3.6 Sp2 Logo和Banner及广
日期值的计算
汉字转拼音
首页“图片更新”图片滚动
简体中文转换为繁体中文的
如何在css中定义链接的下划
Asp.net 实现验证码功能的Web控件
[ 录入:阿标 | 点击数: | 更新时间:2005-3-18 12:52:00]
Asp.net的设计方式和设计理念和其他的如Asp,Jsp,Php,Perl
等都不一样,几乎是完全的面向对象设计!代码的复用就是其
中差异较大的特点之一,Asp.net除了可以用Include以外,还提供
了比较有特点的Web控件,包括:Ascx形式和带设计时支持的控
件[本文属于后者],为了熟悉这些新概念,我自己写了个Web控件。
在实际项目中运行使用良好,以后,要有时间,我还将不断改进。
ValidateCode控件的使用方法:
第一步:
编译我提供的原代码, 然后,在Studio.net 2003工具栏上, 选择"添加/移除项", 选中编译好的dll文件。
第二步:
工具栏上就会多一个Web控件ValidateCode,做好一个Web窗体,在Studio.net 2003开发界面上,直接把控件拖到WebForm上,就OK!
第三步:
在该控件的GraphicOK事件中获取,验证码的字符信息,用于和用户录入做比较!
最后一步:
在网站的根目录下,建一个temp目录(也可以自己指定目录),用于存放验证码
图片,不用担心,代码会自动删除无用的图片!
原代码如下:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace WebValidateCode
{
/// <summary>
/// ValidateCode 的摘要说明。
/// 设计者:王海波 2004-11-20
/// </summary>
///
public enum GraphicType
{
Jpg = 0,
Gif = 1,
Png = 2,
Bmp = 3,
}
//[ToolboxBitmap(@"D:\DotnetApp\ValidateCode\ValidateCode.bmp") ] //设置控件在工具箱上的图标
public class ValidateCode : System.Web.UI.WebControls.WebControl ,INamingContainer
{
private int pCodelen=5;
private int pChartWidth=100;
private int pChartHeight=20;
private GraphicType pChartType;
private string pAuthenCode;
private string pTempImageURLPath="/temp";
private string pAuthenImageFullname;
private string pAuthenImageFullURL;
//生成校验码的变量 start
private Bitmap validateImage;
private Graphics g;
//生成校验码的变量 End
private TextBox txt=new TextBox();
private System.Web.UI.WebControls.Image img= new System.Web.UI.WebControls.Image();
#region 定义控件事件
public delegate void GraphicCreated(object sender, EventArgs e);
public event EventHandler GraphicOK; //在校验图片生成结束以后触发
protected virtual void OnGraphicOK(object sender, EventArgs e)
{
if (GraphicOK != null)
{
//Invokes the delegates.
GraphicOK(sender, e);
}
}
#endregion
#region 控件属性
//生成校验码的长度
[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(true),Description("需要验证码的长度,建议在5~8位之间!")]
public int CodeLength
{
get
{
return pCodelen;
}
set
{
pCodelen = value;
}
}
//生成校验码的长度
[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(true),Description("生成验证码图片的临时存放路径,要求必须是网站下的虚拟目录!")]
public string TempImageURLPath
{
get
{
return pTempImageURLPath;
}
set
{
pTempImageURLPath = value;
}
}
[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(GraphicType.Jpg),Description("选择生成校验图文件的类型(Jpg;Gif;Png;Bmp)!")]
public GraphicType ChartType
{
get
{
return pChartType;
}
set
{
pChartType = value;
}
}
//生成校验码图片的宽度
public int ChartWidth
{
get
{
return pChartWidth;
}
set
{
pChartWidth = value;
}
}
//生成校验码图片的高度
public int ChartHeight
{
get
{
return pChartHeight;
}
set
{
pChartHeight = value;
}
}
//需要生成的校验码
public string AuthenCode
{
get
{
return pAuthenCode;
}
set
{
pAuthenCode = value;
}
}
#endregion
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
System.Web.UI.WebControls.Image objImage;
//TextBox objTxt;
//绘制包含的控件
objImage = (System.Web.UI.WebControls.Image) Controls[0];
//objTxt = (TextBox) Controls[1];
if(pAuthenCode==null)
pAuthenCode=GetValidateCode();
OnGraphicOK(this,EventArgs.Empty );
GetRandomImage(pAuthenCode);
objImage.ImageUrl=pAuthenImageFullURL;
objImage.RenderControl(output);
}
/// <summary>
/// 给控件添加子控件
/// </summary>
protected override void CreateChildControls( )
{
//Controls.Add(btn);
Controls.Add(img);
//Controls.Add(txt);
}
/// <summary>
/// 控件Load时候属性的初始化
/// </summary>
/// <param name="e"></param>
protected override void OnLoad(System.EventArgs e)
{
EraseOldGraphic(); //删除过期的图片
}
/// <summary>
/// 生成随机的
/// </summary>
private void MakeRandomFileName()
{
string strRandName=DateTime.Now.Ticks.ToString()+".jpg";
pAuthenImageFullname=this.Page.MapPath(TempImageURLPath)+@"\"+strRandName;
pAuthenImageFullURL=TempImageURLPath+"/"+strRandName;
}
private void GetRandomImage(string strValidateCode)
{
//生成随即图片的全名,和全URL
MakeRandomFileName();
validateImage = new Bitmap(pChartWidth, pChartHeight, PixelFormat.Format24bppRgb); // .Format24bppRgb);
g = Graphics.FromImage(validateImage);
g.Clear(Color.LightGray) ;
//g.DrawString(strValidateCode , new Font("宋体",16,FontStyle.Bold),new SolidBrush(Color.DarkRed),new PointF(2,2));
for(int i=0;i<strValidateCode.Length;i++)
{
Random r = new Random();
PointF startPos=new PointF(r.Next(3,6)+(r.Next(12,14)*i ),r.Next(-1,2) );
g.DrawString(strValidateCode.Substring(i,1) , new Font("宋体",14,FontStyle.Italic),new SolidBrush(Color.Blue),startPos);
}
//g.FillRectangle(new LinearGradientBrush(new Point(0,0), new Point(120,30), Color.FromArgb(0,0,0,0),Color.FromArgb(255,255,255,255)),0,0,120,30);
switch(pChartType)
{
case GraphicType.Jpg:
validateImage.Save(pAuthenImageFullname, ImageFormat.Jpeg);
break;
case GraphicType.Gif:
validateImage.Save(pAuthenImageFullname, ImageFormat.Gif);
break;
case GraphicType.Png:
validateImage.Save(pAuthenImageFullname, ImageFormat.Png);
break;
case GraphicType.Bmp:
validateImage.Save(pAuthenImageFullname, ImageFormat.Bmp);
break;
default:
validateImage.Save(pAuthenImageFullname, ImageFormat.Jpeg);
break;
}
validateImage.Dispose();
g.Dispose();
}
/// <summary>
/// 动态从数字和字母组成的元素中动态选择生成校验码
/// </summary>
private string GetValidateCode()
{
char[] s = new char[]{'0','1', '2','3','4','5','6','7','8','9','a'
,'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q'
,'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G'
,'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W'
,'X','Y','Z'};
string num = "";
Random r = new Random();
//根据用户需要的长度来定义验证码的位数
for(int i = 0; i < CodeLength; i++)
{
num += s[r.Next(0, s.Length)].ToString();
}
return num;
}
/// <summary>
/// 清除时间超过20秒的临时图片记录
/// </summary>
/// <returns>成功返回true,失败返回false</returns>
public bool EraseOldGraphic()
{
try
{
DirectoryInfo Dinfo=new DirectoryInfo(this.Page.MapPath(pTempImageURLPath));
FileInfo[] FileSet;
if(Dinfo.Exists)
{
switch(pChartType)
{
case GraphicType.Jpg:
FileSet=Dinfo.GetFiles("*.jpg");
break;
case GraphicType.Gif:
FileSet=Dinfo.GetFiles("*.gif");
break;
case GraphicType.Png:
FileSet=Dinfo.GetFiles("*.png");
break;
case GraphicType.Bmp:
FileSet=Dinfo.GetFiles("*.bmp");
break;
default:
FileSet=Dinfo.GetFiles("*.jpg");
break;
}
foreach(FileInfo fileInfo in FileSet)
{
if(fileInfo.Exists)
{
DateTime dts=DateTime.Now;
DateTime dtc=fileInfo.CreationTime;
TimeSpan ts=dts-dtc;
if(ts.Seconds>20)
{
fileInfo.Delete();
}
}
}
}
return true;
}
catch(IOException ioe)
{
return false;
}
}
}
}