详解ASP.NET验证码的生成方法
一般验证码的生成方法都是相同的,主要的步骤都有两步
第一步:随机出一系统验证码的数字或字母,顺便把随机生成的数字或字母写入Cookies或者Session。
第二步:用第一步随机出来的数字或字母来合成图片。
可以看出来验证码的复杂度主要是第二步来完成,你可以根据自己所要的复杂度来设定。
我们一起来看看:
第一步:随机生成数字或字母的方法
///<summary> ///生成验证码的随机数 ///</summary> ///<returns>返回五位随机数</returns> privatestringGenerateCheckCode() { intnumber; charcode; stringcheckCode=String.Empty; Randomrandom=newRandom(); for(inti=0;i<5;i++)//可以任意设定生成验证码的位数 { number=random.Next(); if(number%2==0) code=(char)('0'+(char)(number%10)); else code=(char)('A'+(char)(number%26)); checkCode+=code.ToString(); } Response.Cookies.Add(newHttpCookie("CheckCode",checkCode));//写入COOKIS Session["CheckCode"]=checkCode;//写入Session,可以任意选一下 returncheckCode; }
第二步:生成图片
///<summary> ///生成验证码图片 ///</summary> ///<paramname="checkCode"></param> privatevoidCreateCheckCodeImage(stringcheckCode) { if(checkCode==null||checkCode.Trim()==String.Empty) return; Bitmapimage=newBitmap((int)Math.Ceiling((checkCode.Length*12.5)),22); Graphicsg=Graphics.FromImage(image); try { //生成随机生成器 Randomrandom=newRandom(); //清空图片背景色 g.Clear(Color.White); //画图片的背景噪音线 for(inti=0;i<25;i++) { intx1=random.Next(image.Width); intx2=random.Next(image.Width); inty1=random.Next(image.Height); inty2=random.Next(image.Height); g.DrawLine(newPen(Color.Silver),x1,y1,x2,y2); } Fontfont=newSystem.Drawing.Font("Arial",12,(System.Drawing.FontStyle.Bold|System.Drawing.FontStyle.Italic)); LinearGradientBrushbrush=newLinearGradientBrush(newRectangle(0,0,image.Width,image.Height),Color.Blue,Color.DarkRed,1.2f,true); g.DrawString(checkCode,font,brush,2,2); //画图片的前景噪音点 for(inti=0;i<100;i++) { intx=random.Next(image.Width); inty=random.Next(image.Height); image.SetPixel(x,y,Color.FromArgb(random.Next())); } //画图片的边框线 g.DrawRectangle(newPen(Color.Silver),0,0,image.Width-1,image.Height-1); MemoryStreamms=newMemoryStream(); image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType="image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally {//释放对象资源 g.Dispose(); image.Dispose(); }
*完整程序
先在VS2005里面的项目里面添加一个checkCode.aspx文件,在checkCode.aspx.cs代码文件中添加如下完整代码
usingSystem; usingSystem.Data; usingSystem.Configuration; usingSystem.Collections; usingSystem.Web; usingSystem.Web.Security; usingSystem.Web.UI; usingSystem.Web.UI.WebControls; usingSystem.Web.UI.WebControls.WebParts; usingSystem.Web.UI.HtmlControls; usingSystem.Drawing; usingSystem.IO; usingSystem.Drawing.Drawing2D; publicpartialclasscheckCode:System.Web.UI.Page { protectedvoidPage_Load(objectsender,EventArgse) { CreateCheckCodeImage(GenerateCheckCode());//调用下面两个方法; } ///<summary> ///生成验证码的随机数 ///</summary> ///<returns>返回五位随机数</returns> privatestringGenerateCheckCode() { intnumber; charcode; stringcheckCode=String.Empty; Randomrandom=newRandom(); for(inti=0;i<5;i++)//可以任意设定生成验证码的位数 { number=random.Next(); if(number%2==0) code=(char)('0'+(char)(number%10)); else code=(char)('A'+(char)(number%26)); checkCode+=code.ToString(); } Response.Cookies.Add(newHttpCookie("CheckCode",checkCode));//写入COOKIS Session["CheckCode"]=checkCode;//写入Session,可以任意选一下 returncheckCode; } ///<summary> ///生成验证码图片 ///</summary> ///<paramname="checkCode"></param> privatevoidCreateCheckCodeImage(stringcheckCode) { if(checkCode==null||checkCode.Trim()==String.Empty) return; Bitmapimage=newBitmap((int)Math.Ceiling((checkCode.Length*12.5)),22); Graphicsg=Graphics.FromImage(image); try { //生成随机生成器 Randomrandom=newRandom(); //清空图片背景色 g.Clear(Color.White); //画图片的背景噪音线 for(inti=0;i<25;i++) { intx1=random.Next(image.Width); intx2=random.Next(image.Width); inty1=random.Next(image.Height); inty2=random.Next(image.Height); g.DrawLine(newPen(Color.Silver),x1,y1,x2,y2); } Fontfont=newSystem.Drawing.Font("Arial",12,(System.Drawing.FontStyle.Bold|System.Drawing.FontStyle.Italic)); LinearGradientBrushbrush=newLinearGradientBrush(newRectangle(0,0,image.Width,image.Height),Color.Blue,Color.DarkRed,1.2f,true); g.DrawString(checkCode,font,brush,2,2); //画图片的前景噪音点 for(inti=0;i<100;i++) { intx=random.Next(image.Width); inty=random.Next(image.Height); image.SetPixel(x,y,Color.FromArgb(random.Next())); } //画图片的边框线 g.DrawRectangle(newPen(Color.Silver),0,0,image.Width-1,image.Height-1); MemoryStreamms=newMemoryStream(); image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType="image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally {//释放对象资源 g.Dispose(); image.Dispose(); } } }
上面生成验证码的页面都做好了,我们来调用看看:
在你需要用到验证码的地方加了Image控件
<asp:ImageID="Image1"runat="server"ImageUrl="~/checkCode.aspx"/>
这样验证码就会显示到Image控件上面了!
显示弄好了,当然我们要判断一下用户的输入是否正确!
只要我们取得用户输入的值跟Cookis或者Session对比就OK了
取Cookies的值Request.Cookies["CheckCode"].Value
取Session的值Session["CheckCode"].ToString()(最好先判断Session是否空)
如果不要区分大小写的话,就把用户输入的值和Cookies或Session的值都转成大写或都小写
附用法
protectedvoidButton1_Click(objectsender,EventArgse) { if(Request.Cookies["CheckCode"].Value==TextBox1.Text.Trim().ToString()) { Response.Write("Cookiesisright"); } else { Response.Write("Cookiesiswrong"); } if(Session["CheckCode"]!=null) { if(Session["CheckCode"].ToString().ToUpper()==TextBox1.Text.Trim().ToString().ToUpper()) //这样写可以不能区分大小写 { Response.Write("Sessionisright"); } else { Response.Write("Sessioniswrong"); } } }
以上就是本文的全部内容,教大家如何制作ASP.NET验证码,希望大家喜欢。