ASP.NET 验证码 攻略,支持中文,字母,数字

做登录界面难免要做验证码,今天我就做了一个,后来索性做了一个全的,支持中英文(其它字符也是可以得)。

验证码原理:

  • 图片生成:

首先创建一种Bitmap,然后给这张图片加背景色,加验证码,加噪音。其中主要是噪音点和噪音线。另外,字符串的变形处理也很关键,我弄得比较简单。

  • 随机验证码生成

先创建一个字符源数组(.net支持中文),该数组存放了验证码所需要得所有字符串。然后再利用随机数生成一个验证码字符串,并从字符源中取出字符放到验证码里。

关键点:字符源数组,你要考虑用户得容易识别性,比如字母得混淆如1和L,0和O。如果还要中文,应该挑选笔划少得,用户常识别得.输入法输入时按键少得。

  • 验证码得判断

可以使用cookie或者Session来保存,注意大小写。因为用户喜欢输入小写字母,而图片上大写字符比较好看.这就要注意大小写得转换。

代码:

gif.aspx 用来生成图像和保存到Cookie或者Session.

// *************************
// 中英文验证码
// date:2006-12-25
// Program:greenerycn@163.com
// ***************************
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Imaging;
/**/ ///<summary>
///本页面生成随机图像验证码,生成gif图像.
///</summary>


public partial class gif:System.Web.UI.Page
... {
protectedvoidPage_Load(objectsender,EventArgse)
...{
//字体大小
intfont_size=14;
intwidth=0;
//使用纯数字做验证码
//stringvalidate_str=Random_Number(4);

//使用数字加字母
stringvalidate_str=Random_String(4);

width
=validate_str.Length*(font_size+1);//计算宽度

//使用中文
//stringvalidate_str=Random_Chinese(4);

//使用中文;加数字加字母
//stringvalidate_str=Random_Chinese_Char(4);
//width=validate_str.Length*(font_size)*2;

//创建图像
Create_Validate_Image(validate_str,width,30,font_size);

//写入Cookie
//Response.Cookies.Add(newHttpCookie("ValidateCode",validate_str));

//写入Session
Session["key"]=validate_str;
}

/**////<summary>
///生成随机数字
///</summary>
///<paramname="size">需要的数字个数</param>
///<returns>生成的字符串</returns>

privatestringRandom_Number(intsize)
...{
intnumber;
charcode;
stringvalidate_str=string.Empty;
System.Randomrandom
=newRandom();
for(inti=0;i<size;i++)
...{
//返回一个指定范围内的随机数
number=random.Next(48,57);//48,57为ASCII码:0-9
code=(char)(number);
validate_str
+=code;
}

returnvalidate_str;
}

/**////<summary>
///生成随机数字加字母
///</summary>
///<paramname="validate_string_size">字符串长度</param>
///<returns>字符串</returns>

privatestringRandom_String(intvalidate_string_size)
...{
stringvchar="23456789ABCDEGHKMNPQRSUVWXYZ";
stringvnum="";
System.Randomrand
=newRandom();
for(inti=0;i<validate_string_size;i++)
...{
intt=rand.Next(vchar.Length);
vnum
+=vchar[t];
}

returnvnum;
}

/**////<summary>
///生成中文验证码字符串
///</summary>
///<paramname="validate_string_size">字符个数</param>
///<returns>验证码字符串</returns>

privatestringRandom_Chinese(intvalidate_string_size)
...{
//stringvchar="2,3,4,5,6,7,8,9,a,b,c,d,e,g,h,k,m,n,p,q,r,s,u,v,w,x,y,z";
//这个字符源比较少,字也常用,适合五笔用户输入
stringcchar="我人有的和主产不为这工要在地一上是中国同经以发了民搜索就计算机业学习科技美女东西南北";
//这个字符源比较多,字的笔划少,(输入法还没考虑),
//stringcchar="乙十丁厂七卜人九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术可丙左厉右石布龙平灭轧东卡北占业旧帅归且旦目叶甲申叮电号田由史只央兄叼叫另叨叹四生失禾丘付仗代仙们仪白仔他斥瓜乎丛令用甩印乐句匆册犯外处冬鸟务包饥主市立闪兰半汁汇头汉宁穴它讨写让礼训必议讯记永司尼民出辽奶奴加召皮边发孕圣";
stringvnum="";
System.Randomrand
=newRandom();
for(inti=0;i<validate_string_size;i++)
...{
intt=rand.Next(cchar.Length);
vnum
+=cchar[t];
}

returnvnum;
}

/**////<summary>
///生成中英文验证码字符串
///</summary>
///<paramname="validate_string_size">字符个数</param>
///<returns>验证码字符串</returns>

privatestringRandom_Chinese_Char(intvalidate_string_size)
...{
stringvchar="23456789ABCDEGHKMNPQRSUVWXYZ我人有的和九主产不七为这工要十在地一上八是中国同经以四发了五民搜索就计六算机合肥业学习科技安徽美女东西南北二三";
stringvnum="";
System.Randomrand
=newRandom();
for(inti=0;i<validate_string_size;i++)
...{
intt=rand.Next(vchar.Length);
vnum
+=vchar[t];
}

returnvnum;
}

/**////<summary>
///生成图像
///</summary>
///<paramname="validate_str">随机字符串</param>
///<paramname="width">图片宽度</param>
///<paramname="height">图片高度</param>
///<paramname="font_size">字体大小</param>

privatevoidCreate_Validate_Image(stringvalidate_str,intwidth,intheight,intfont_size)
...{
if(validate_str==null||validate_str.Trim()==String.Empty)
return;

System.Drawing.Bitmapvalidate_image
=newSystem.Drawing.Bitmap(width,height);
Graphicsg
=Graphics.FromImage(validate_image);
try
...{
//生成随机生成器
Randomrandom=newRandom();

//清空图片背景色
g.Clear(Color.White);

//画图片的背景噪音线,15为噪音线条数
for(inti=0;i<15;i++)
...{
intx1=random.Next(validate_image.Width);
intx2=random.Next(validate_image.Width);
inty1=random.Next(validate_image.Height);
inty2=random.Next(validate_image.Height);
g.DrawLine(
newPen(Color.Silver),x1,y1,x2,y2);
}

//画字符串
//文字字体
Fontfont=newSystem.Drawing.Font("Arial",font_size,(System.Drawing.FontStyle.Bold|System.Drawing.FontStyle.Italic));
//文字颜色
//带渐变得效果
//System.Drawing.Drawing2D.LinearGradientBrushbrush=newSystem.Drawing.Drawing2D.LinearGradientBrush(newRectangle(0,0,validate_image.Width,validate_image.Height),Color.Blue,Color.Black,1.2f,true);
//普通单色
System.Drawing.SolidBrushbrush=newSystem.Drawing.SolidBrush(Color.Green);
g.DrawString(validate_str,font,brush,
2,(height/2-3*font_size/4));
//画图片的前景噪音点,50为噪音点数
for(inti=0;i<50;i++)
...{
intx=random.Next(validate_image.Width);
inty=random.Next(validate_image.Height);
validate_image.SetPixel(x,y,Color.FromArgb(random.Next()));
}

//画图片的边框线
g.DrawRectangle(newPen(Color.Silver),0,0,validate_image.Width-1,validate_image.Height-1);
System.IO.MemoryStreamms
=newSystem.IO.MemoryStream();
validate_image.Save(ms,ImageFormat.Gif);
Response.ClearContent();
Response.ContentType
="image/GIF";
Response.BinaryWrite(ms.ToArray());
}

finally
...{
g.Dispose();
validate_image.Dispose();
}

}



}

test.aspx.其中有一个textbox.一个image,一个button

protected void Button1_Click( object sender,EventArgse)
... {
//HttpCookieCollectioncookies=Request.Cookies;
//stringtmp=cookies["ImageV"].Value;
//然后比较tmp与获取的验证码文本框中的值是否相同
stringvalidate_str=TextBox1.Text.ToString().ToUpper();
if(validate_str.Trim()==Session["key"].ToString())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值