详解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验证码,希望大家喜欢。