分享
 
 
 

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

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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;

}

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有