`

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

}
}


分享到:
评论

相关推荐

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

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

    ASP.NET页面验证码控件,方便快捷使用(附使用说明)

    可以直接将.dll文件复制到工具栏,然后再web.config里加入一段代码(使用说明中有源代码)即可。谢谢,新手上路,请多照顾~

    asp.net验证码小控件

    asp.net验证码,为web开发登录界面提供验证码功能,非常实用,功能很强大,使用很简单。

    Asp.Net 自定义验证码控件

    单击可自动刷新的自定义验证码控件。 验证码原理: 由随机的字符串生成图片, 图片加入干扰,防止暴力破解,人可以识别, 生成图片的同时,将随机字符串保存, 判断人工输入和保存的字符串的一致性。

    asp.net验证码控件下载及详解

    本人从各网站下载了SuperAuthenticationCode的dll验证码控件,几经查阅资料并亲自进行调试,总算搞明白了怎么调用。在rar文档中有readme.txt文件进行了如何在web.cfg,aspx,aspx.cs,以及dll对应的.refresh文件修改,...

    asp.net(c#)验证码web用户控件

    把文件解压后把类文件复制到app_code文件夹中 把Web控件和功能页面复制到网站根目录下 把web控件拖到网页就可用了 在代码中可以访问 web控件的checknumber 属性是否用户输入的是否相等就起到了验证的效果 十分方便

    ASP.NET学习大全

    Asp.net 实现验证码功能的Web控件.txt asp.net常用的javascript经典例子.doc asp.net常用函数表.doc ASP.NET程序中常用的三十三种代码.doc ASP.NET程序中实现校验码图像生成.txt ASP.NET导出EXCEL类.txt ASP.NET导出...

    asp.net常用Web服务器控件

    4.1 使用控件显示文本 ...实例 显示长日期格式时间 实例 显示金额格式文本...实例 DataList控件实现删除功能 4.9 Repeater控件的使用 实例 Repeater控件数据绑定 实例 Repeater控件分页 实例 编辑Repeater控件标识商品信息

    asp.net学习大全(超全面的资料整合)

    Asp.net 实现验证码功能的Web控件.txt asp.net常用的javascript经典例子.doc asp.net常用函数表.doc ASP.NET程序中常用的三十三种代码.doc ASP.NET程序中实现校验码图像生成.txt ASP.NET导出EXCEL类.txt ASP.NET导出...

    ASP.NET基础控件-教程

     ASP.net验证码实现  图片水印  防盗链  .NET(C#)连接各类数据库  读取配置文件数据库连接串  正则表达式验证  递归把十进制转换八进制(面试题目)  Mysql测试连接(DLL的引用)(插入与读取)  Asp.Net编辑器...

    ASP.NET 无刷新数字验证码控件

    使用该控件前,请添加如下配置节至web.config 文件中 ,Zfphere.Framework.Common"/&gt; &lt;/httpHandlers&gt;

    .net中验证码的实现(字母与数字混合)

    在创建验证码的功能时,将验证码的代码放在一个单独的页面中,再有image控件来调用验证码图片,在引用设计页面中添加的代码:&lt;asp:Image Runat="server"ID="ImageCheck"ImageUrl="ValidateCode.aspx"&gt;&lt;/asp:Image&gt;。...

    asp.net专家疑难解答200问

    如何在ASP.NET实现验证码 196.如何在本地取得指定网页的源代码 197.如何在ASP.NET中做一个日期选择器 198.如何在弹出对话框的同时保持页面的显示 199.如何点击按钮弹出新页面,输入数据后返回并且不...

    asp.net开发常用整理集合

     ASP.net验证码实现  图片水印  防盗链  .NET(C#)连接各类数据库  读取配置文件数据库连接串  正则表达式验证  递归把十进制转换八进制(面试题目)  Mysql测试连接(DLL的引用)(插入与读取)  ...

    asp.net验证码控件源码.rar

    public class ValidateCodeControl : WebControl, IDisposable, IPostBackDataHandler { #region 定义变量 #region 控件变量 private TextBox txbValidateCodeInput; private Image imgValidateCodeImage; ...

    asp.net知识库

    Asp.net 2.0功能体验,细节之Web控件(一) 隐藏控件 Asp.net 2.0功能体验,总体设计思想 Asp.net 2.0 WebPart使用经验点滴 革新:.NET 2.0的自定义配置文件体系初探 关于如何在ASP.NET 2.0中定制Expression ...

    asp.net专家疑难解答200问源码

    195.如何在ASP.NET实现验证码 196.如何在本地取得指定网页的源代码 197.如何在ASP.NET中做一个日期选择器 198.如何在弹出对话框的同时保持页面的显示 199.如何点击按钮弹出新页面,输入数据后返回并且不刷新页面...

Global site tag (gtag.js) - Google Analytics