首页 > 编程 > .NET > 正文

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

2024-07-10 12:56:26
字体:
来源:转载
供稿:网友
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)[email protected]"/"+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;
}
}

}
}




发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表