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;
}
}
}
}
转载于:https://www.cnblogs.com/kangtr/archive/2005/08/17/217126.html
Asp.net 实现验证码功能的Web控件相关推荐
- [转]利用ASP.NET 2.0创建自定义Web控件(1)
原址:http://hi.baidu.com/sjbh/blog/item/cc58fd1bd35d3ad2ad6e7593.html 简介 从使用基本的文本编辑器到创作标记页面,Web 开发已经 ...
- 探讨ASP.NET 2.0中的Web控件改进技术(3)
当你最开始在Visual Studio 2005中使用Windows表单控件或是ASP.NET Web控件时,你首先会注意到,在许多控件右上角出现一个箭头形状的小玩意儿(见图2中的示例).点击这个箭头 ...
- 探讨ASP.NET 2.0中的Web控件改进技术(2)
我的观点是:ViewState有可能成为你最好的朋友,也有可能成为你最坏的敌人-这要依赖于你使用它的方式来决定.如果你在以前曾经使用过ViewState,那么,你肯定会喜欢新的ControlState ...
- 探讨ASP.NET2.0的Web控件改进之概述
作者: 朱先忠编译 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩:但是,你是否了解到有关定制Web控件开发方面的重 ...
- 探讨ASP.NET2.0中的Web控件改进技术
全面探讨ASP.NET 2.0中的Web控件改进技术之概述(一) ASP.NET 2.0并没有抛弃1.1版本中的任何现有控件,而是增加了一组新的控件;同时还引入了若干新的控件开发技术.本系列文章将对这 ...
- (转) ASP.NET 2.0:使用用户控件和定制的Web部件个人化你的门户网站(二)
Web部件目录 我们已经见过了如何在 WebPartZones 控件中事先放入Web部件.你还可以用另外一种方法完成这个功能,那就是允许用户在运行时添加新的Web部件.通过使用 CatalogZone ...
- Web控件文本框Reset的功能
在前一篇中<怎样实现Web控件文本框Reset的功能>http://www.cnblogs.com/insus/p/4120889.html Insus.NET只实现了文本框的功能.单个或 ...
- 【ASP.NET】第八课——GridView 控件的编辑功能优化,GridView控件中嵌套DropDownList控件
知识点:掌握 GridView 的编辑.高亮显示的功能 .GridView控件中嵌套DropDownList控件获取数据源. [ASP.NET]第七课--数据绑定和 GridView 控件的使用 重点 ...
- 【Asp.net】——Web控件与HTML控件的区别
在看Asp.net视频的过程中,遇到对控件的一些解释,通过查询资料,简单的说说这二者的区别. 控件位置 在VS中,HTML控件位置在: Web控件位置: 控件样式 HTML控件: 除了几个特殊的控件: ...
最新文章
- python中opencv是什么_python-opencv的用法
- 作者:陈维政,男,北京大学博士生。
- iOS开发--正则表达式
- Bzoj 2154: Crash的数字表格(积性函数)
- 药店药品管理方案,药店药品的盘点方案,假设进行药店药品的高效盘点?药品盘点步骤是?...
- [小甲鱼]汇编语言笔记 基础知识
- Excel文件转换为XML以及Linux文件编码格式转换
- java timer缺陷
- 包干到户是最好的软件项目管理方法
- CC00009.CloudOpenStack——|OpenStack组件.V02|——|openstack-glance|controller节点下部署glanc
- 2022年11月骨传导耳机排名,骨传导蓝牙耳机品牌怎么选?
- 伤感qq日志-爱冷了 情淡了、心累了,陌生了
- 2021年会议平板十大品牌榜中榜,十大会议平板品牌销量排行榜
- 发送到桌面快捷方式没有了如何解决?
- 黄金圈法则:成功者必备的深度思考方法
- 关于指针为什么是4个字节大小
- FPGA实现SD卡音乐播放
- 小程序突然报module is not defined_【第一季完】(字幕+讲解)小谢尔顿S1E22 Meemaw#39;s two boyfriends...
- 小猿理财:股神巴菲特曾多次公开向普通投资者推荐指数基金,原因就在这里!
- MATLAB处理OBJ模型
热门文章
- vlookup如何将符合条件的多个数据全部查找出来
- 【Java】在代码中设置输出字符集为UTF-8
- 轩辕剑天之痕游戏java,轩辕剑之天之痕手游
- 盘点中国最牛的五个程序员,有一个年薪上亿,有一个身家上千亿
- Error: L6200E: Symbol SysTick_Handler multiply defined (by stm32f10x_it.o and m
- C++ 特殊成员函数
- QMIX: Monotonic Value Function Factorisation for Deep Multi-Agent Reinforcement Learning
- minicap的安装
- 常用电子器件 ——二极管
- 分析型数据库 AnalyticDB学习 ----基本介绍