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> publicpartialclass gif : System.Web.UI.Page { protectedvoid Page_Load(object sender, EventArgs e) { //字体大小 int font_size =14; int width=0; //使用纯数字做验证码 // string validate_str = Random_Number(4); //使用数字加字母 string validate_str = Random_String(4); width=validate_str.Length * (font_size +1);//计算宽度 //使用中文 // string validate_str = Random_Chinese(4); //使用中文;加数字加字母 // string validate_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(new HttpCookie("ValidateCode",validate_str)); //写入Session Session["key"] = validate_str; } ///<summary> /// 生成随机数字 ///</summary> ///<param name="size">需要的数字个数</param> ///<returns>生成的字符串</returns> privatestring Random_Number(int size) { int number; char code; string validate_str =string.Empty; System.Random random =new Random(); for (int i =0; i < size; i++) { //返回一个指定范围内的随机数 number = random.Next(48,57); //48,57为ASCII码:0-9 code = (char)(number); validate_str += code; } return validate_str; } ///<summary> ///生成随机数字加字母 ///</summary> ///<param name="validate_string_size">字符串长度</param> ///<returns>字符串</returns> privatestring Random_String(int validate_string_size) { string vchar ="23456789ABCDEGHKMNPQRSUVWXYZ"; string vnum=""; System.Random rand=new Random(); for (int i =0; i <validate_string_size; i++) { int t = rand.Next(vchar.Length); vnum += vchar[t]; } return vnum; } ///<summary> /// 生成中文验证码字符串 ///</summary> ///<param name="validate_string_size">字符个数</param> ///<returns>验证码字符串</returns> privatestring Random_Chinese(int validate_string_size) { //string vchar = "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"; //这个字符源比较少,字也常用,适合五笔用户输入 string cchar ="我人有的和主产不为这工要在地一上是中国同经以发了民搜索就计算机业学习科技美女东西南北"; //这个 字符源比较多,字的笔划少,(输入法还没考虑), //string cchar = "乙十丁厂七卜人九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术可丙左厉右石布龙平灭轧东卡北占业旧帅归且旦目叶甲申叮电号田由史只央兄叼叫另叨叹四生失禾丘付仗代仙们仪白仔他斥瓜乎丛令用甩印乐句匆册犯外处冬鸟务包饥主市立闪兰半汁汇头汉宁穴它讨写让礼训必议讯记永司尼民出辽奶奴加召皮边发孕圣"; string vnum =""; System.Random rand =new Random(); for (int i =0; i < validate_string_size; i++) { int t = rand.Next(cchar.Length); vnum += cchar[t]; } return vnum; } ///<summary> /// 生成中英文验证码字符串 ///</summary> ///<param name="validate_string_size">字符个数</param> ///<returns>验证码字符串</returns> privatestring Random_Chinese_Char(int validate_string_size) { string vchar ="23456789ABCDEGHKMNPQRSUVWXYZ我人有的和九主产不七为这工要十在地一上八是中国同经以四发了五民搜索就计六算机合肥业学习科技安徽美女东西南北二三"; string vnum =""; System.Random rand =new Random(); for (int i =0; i < validate_string_size; i++) { int t = rand.Next(vchar.Length); vnum += vchar[t]; } return vnum; } ///<summary> /// 生成图像 ///</summary> ///<param name="validate_str">随机字符串</param> ///<param name="width">图片宽度</param> ///<param name="height">图片高度</param> ///<param name="font_size">字体大小</param> privatevoid Create_Validate_Image(string validate_str,int width,int height,int font_size) { if (validate_str ==null|| validate_str.Trim() == String.Empty) return; System.Drawing.Bitmap validate_image=new System.Drawing.Bitmap(width,height); Graphics g=Graphics.FromImage(validate_image); try { //生成随机生成器 Random random =new Random(); //清空图片背景色 g.Clear(Color.White); //画图片的背景噪音线,15为噪音线条数 for (int i =0; i <15; i++) { int x1 = random.Next(validate_image.Width); int x2 = random.Next(validate_image.Width); int y1 = random.Next(validate_image.Height); int y2 = random.Next(validate_image.Height); g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); } //画字符串 //文字字体 Font font =new System.Drawing.Font("Arial", font_size, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)); //文字颜色 //带渐变得效果 //System.Drawing.Drawing2D.LinearGradientBrush brush=new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0,0,validate_image.Width,validate_image.Height),Color.Blue,Color.Black,1.2f,true); //普通单色 System.Drawing.SolidBrush brush =new System.Drawing.SolidBrush(Color.Green); g.DrawString(validate_str,font,brush,2,(height/2-3*font_size/4)); //画图片的前景噪音点,50为噪音点数 for (int i =0; i <50; i++) { int x = random.Next(validate_image.Width); int y = random.Next(validate_image.Height); validate_image.SetPixel(x, y, Color.FromArgb(random.Next())); } //画图片的边框线 g.DrawRectangle(new Pen(Color.Silver),0,0,validate_image.Width-1,validate_image.Height-1); System.IO.MemoryStream ms=new System.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
protectedvoid Button1_Click(object sender, EventArgs e) { //HttpCookieCollection cookies = Request.Cookies; //string tmp = cookies["ImageV"].Value; //然后比较tmp与获取的验证码文本框中的值是否相同 string validate_str = TextBox1.Text.ToString().ToUpper(); if (validate_str.Trim() == Session["key"].ToString()) { Response.Write("<script >alert('验证成功');</script>"); } }
作者: 初行
Q Q: 121866673
来源: http://zxlovenet.cnblogs.com
声明: 本文原创发表于博客园,作者为初行本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
消息:此博客已停止更新,想了解最新博客更新请关注我的新博客 Noogel's notes
推荐: 推荐使用为知笔记(WizNote),它是电脑、手机、平板上都能用的云笔记软件,还可以分类管理和共享资料,使用我的邀请码注册:https://note.wiz.cn/i/06102d9e
打赏: 如果您觉得文章对您的工作有帮助,请小额打赏我一些,鼓励我写出更好的文章!
Q Q: 121866673
来源: http://zxlovenet.cnblogs.com
声明: 本文原创发表于博客园,作者为初行本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
消息:此博客已停止更新,想了解最新博客更新请关注我的新博客 Noogel's notes
推荐: 推荐使用为知笔记(WizNote),它是电脑、手机、平板上都能用的云笔记软件,还可以分类管理和共享资料,使用我的邀请码注册:https://note.wiz.cn/i/06102d9e
打赏: 如果您觉得文章对您的工作有帮助,请小额打赏我一些,鼓励我写出更好的文章!
微信打赏
支付宝打赏