Asp.net 实现验证码功能的Web控件

asp.net|web|控件|验证码

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;
}
}

}
}

时间: 2024-09-11 09:50:08

Asp.net 实现验证码功能的Web控件的相关文章

探讨ASP.NET 2.0中的Web控件改进技术

asp.net|web|控件 ASP.NET 2.0并没有抛弃1.1版本中的任何现有控件,而是增加了一组新的控件;同时还引入了若干新的控件开发技术.本系列文章将对这些内容展开全面探讨. 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩;但是,你是否了解到有关定制Web控件开发方面的重大变化?这正是我在本文中所想讨论的.如果你已经从事于控件开发,那么,我想本文所描述的ASP.NET 2.0中的新的改进特征会立即应用于

ASP.NET4灵活显标记:数据Web控件改进

长期以来,使用Web控件的开发者都欣赏这些控件所具有的高生产力,但在控 制它们生成的标记方面却付出了一定的代价.例如,许多ASP.NET控件会自动地使 用元素来包装它们的内容,原因是为了方便布局或样式控制.然而,这种行为却 与过去几年中不断发展的网络标准相违背;这些标准支持使用更清洁和更简洁的 HTML标记,而建议节约使用<table>标记;同时,它们提倡应当尽可能使用 层叠样式表(CSS)来实现网页的布局和造型.此外,<table>元素和其他自 动添加的内容使得使用CSS来修饰W

一起谈.NET技术,ASP.NET4灵活显标记:数据Web控件改进

长期以来,使用Web控件的开发者都欣赏这些控件所具有的高生产力,但在控制它们生成的标记方面却付出了一定的代价.例如,许多ASP.NET控件会自动地使用元素来包装它们的内容,原因是为了方便布局或样式控制.然而,这种行为却与过去几年中不断发展的网络标准相违背;这些标准支持使用更清洁和更简洁的HTML标记,而建议节约使用标记;同时,它们提倡应当尽可能使用层叠样式表(CSS)来实现网页的布局和造型.此外,元素和其他自动添加的内容使得使用CSS来修饰Web控件和从客户端使用这些控件更加困难. ASP.NE

详细阐述利用ASP.NET 2.0创建自定义Web控件开发说明

asp.net|web|创建|控件|控件开发 简介 从使用基本的文本编辑器到创作标记页面,Web 开发已经经历了一个漫长的过程.目前,集成开发环境 (IDE) 为开发过程中的几乎每个方面都提供了图形化表示形式.此外,还实现各种说明性编程技术以提高效率并降低出现错误的几率.Visual Studio 2005 和 ASP.NET 2.0 中的控件体系结构遵循了这些编程趋势,并且提供了可靠的.可扩展的环境,该环境设计为使开发人员可以创建能够以说明方式配置的控件. 此外,ASP.NET 中新的自适应呈

利用 ASP.NET 2.0 创建自定义 Web 控件

asp.net|web|创建|控件 Jayesh Patel.Bryan Acker.Robert McGovernInfusion Development适用于:Microsoft ASP.NET 2.0Microsoft Visual Studio 2005 摘要:ASP.NET 2.0 中新的自适应呈现模型为控件编写人员提供了很多新的选项.本文展示了这些选项如何使创建 ASP.NET 的自定义控件变得比以前更加容易. 本页内容 简介 自适应呈现模型 创建自定义服务器控件 TagKey 使用

利用ASP.NET 2.0创建自定义Web控件

asp.net|web|创建|控件 从使用基本的文本编辑器到创作标记页面,Web 开发已经经历了一个漫长的过程.目前,集成开发环境 (IDE) 为开发过程中的几乎每个方面都提供了图形化表示形式.此外,还实现各种说明性编程技术以提高效率并降低出现错误的几率.Visual Studio 2005 和 ASP.NET 2.0 中的控件体系结构遵循了这些编程趋势,并且提供了可靠的.可扩展的环境,该环境设计为使开发人员可以创建能够以说明方式配置的控件. 此外,ASP.NET 中新的自适应呈现模型减少了编写

asp.net 2.0中不同web控件之间的相互调用

asp.net|web|控件 在asp.net 2.0中,要在不同的web控件之间互相调用,必须要<%@ Reference VirtualPath="另一控件名称">来引用,举例如下 default.aspx:<form id="form1" runat="server">        <uc1:WebUserControl id="WebUserControl1" runat="s

[转]利用ASP.NET 2.0创建自定义Web控件(2)

原址:http://hi.baidu.com/sjbh/blog/item/5a8298454403a321cffca39c.html   如何生成的? Render() 方法基本上控制着 WebControl 的整个输出.默认情况下,Render() 方法实际上会依次调用 RenderBeginTag().RenderContents() 以及 RenderEndTag().尽管在 ASP.NET 1.x 中调用结构并未变化,但由于该呈现模型,修改这些调用的影响却发生了变化. 您可以覆盖 Re

探讨ASP.NET 2.0的Web控件改进之概述

asp.net|web|控件 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩:但是,你是否了解到有关定制Web控件开发方面的重大变化?这正是我在本文中所想讨论的.如果你已经从事于控件开发,那么,我想本文所描述的ASP.NET 2.0中的新的改进特征会立即应用于你的控件开发中. 首先应该注意的是,你以前使用ASP.NET 1.1(或1.0)开发的所有Web控件在2.0版本下将继续良好运行-微软并没有破坏你的现有代码