• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

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

发布: 2007-6-30 23:38 | 作者: admin | 来源: | 查看: 48次 | 进入软件测试论坛讨论

领测软件测试网 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;
}
}

}
}




延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网