asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET 实现验证码功能的Web控件


发布日期:2024年01月09日
 
ASP.NET 实现验证码功能的Web控件

的设计方式和设计理念和其他的如AspJspPhpPerl等都不一样几乎是完全的面向对象设计!代码的复用就是其中差异较大的特点之一除了可以用Include以外还提供了比较有特点的Web控件包括Ascx形式和带设计时支持的控件[本文属于后者]为了熟悉这些新概念我自己写了个Web控件

在实际项目中运行使用良好以后要有时间我还将不断改进

ValidateCode控件的使用方法:

第一步

编译我提供的原代码 然后工具栏上 选择添加/移除项 选中编译好的dll文件

第二步

工具栏上就会多一个Web控件ValidateCode做好一个Web窗体开发界面上直接把控件拖到WebForm上就OK!

第三步

在该控件的GraphicOK事件中获取验证码的字符信息用于和用户录入做比较!

最后一步

在网站的根目录下建一个temp目录(也可以自己指定目录)用于存放验证码

图片不用担心代码会自动删除无用的图片!

原代码如下

using System;

using SystemWebUI;

using SystemWebUIWebControls;

using SystemComponentModel;

using SystemIO;

using SystemDrawing;

using SystemDrawingDrawingD;

using SystemDrawingImaging;

namespace WebValidateCode

{

/// <summary>

/// ValidateCode 的摘要说明

/// 设计者:王海波

/// </summary>

///

public enum GraphicType

{

Jpg =

Gif =

Png =

Bmp =

}

//[ToolboxBitmap(@D:\DotnetApp\ValidateCode\ValidateCodebmp) ] //设置控件在工具箱上的图标

public class ValidateCode : SystemWebUIWebControlsWebControl INamingContainer

{

private int pCodelen=;

private int pChartWidth=;

private int pChartHeight=;

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 SystemWebUIWebControlsImage img= new SystemWebUIWebControlsImage();

#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(需要验证码的长度建议在~位之间!)]

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(GraphicTypeJpg)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)

{

SystemWebUIWebControlsImage objImage;

//TextBox objTxt;

//绘制包含的控件

objImage= (SystemWebUIWebControlsImage) Controls[];

//objTxt= (TextBox) Controls[];

if(pAuthenCode==null)

pAuthenCode=GetValidateCode();

OnGraphicOK(thisEventArgsEmpty );

GetRandomImage(pAuthenCode);

objImageImageUrl=pAuthenImageFullURL;

objImageRenderControl(output);

}

/// <summary>

/// 给控件添加子控件

/// </summary>

protectedoverridevoidCreateChildControls()

{

//ControlsAdd(btn);

ControlsAdd(img);

//ControlsAdd(txt);

}

/// <summary>

/// 控件Load时候属性的初始化

/// </summary>

/// <param name=e></param>

protectedoverridevoid OnLoad(SystemEventArgs e)

{

EraseOldGraphic(); //删除过期的图片

}

/// <summary>

/// 生成随机的

/// </summary>

private void MakeRandomFileName()

{

string strRandName=DateTimeNowTicksToString()+jpg;

pAuthenImageFullname=thisPageMapPath(TempImageURLPath)+@\+strRandName;

pAuthenImageFullURL=TempImageURLPath+/+strRandName;

}

private void GetRandomImage(string strValidateCode)

{

//生成随即图片的全名和全URL

MakeRandomFileName();

validateImage = new Bitmap(pChartWidth pChartHeight PixelFormatFormatbppRgb); // FormatbppRgb);

g = GraphicsFromImage(validateImage);

gClear(ColorLightGray) ;

//gDrawString(strValidateCode new Font(宋体FontStyleBold)new SolidBrush(ColorDarkRed)new PointF());

for(int i=;i<strValidateCodeLength;i++)

{

Random r = new Random();

PointF startPos=new PointF(rNext()+(rNext()*i )rNext() );

gDrawString(strValidateCodeSubstring(i) new Font(宋体FontStyleItalic)new SolidBrush(ColorBlue)startPos);

}

//gFillRectangle(new LinearGradientBrush(new Point() new Point() ColorFromArgb()ColorFromArgb()));

switch(pChartType)

{

case GraphicTypeJpg:

validateImageSave(pAuthenImageFullname ImageFormatJpeg);

break;

case GraphicTypeGif:

validateImageSave(pAuthenImageFullname ImageFormatGif);

break;

case GraphicTypePng:

validateImageSave(pAuthenImageFullname ImageFormatPng);

break;

case GraphicTypeBmp:

validateImageSave(pAuthenImageFullname ImageFormatBmp);

break;

default:

validateImageSave(pAuthenImageFullname ImageFormatJpeg);

break;

}

validateImageDispose();

gDispose();

}

/// <summary>

/// 动态从数字和字母组成的元素中动态选择生成校验码

/// </summary>

private string GetValidateCode()

上一篇:优化ASP.NET应用程序性能研究与探讨

下一篇:ASP.NET 数据库缓存依赖