C#验证码.docx
《C#验证码.docx》由会员分享,可在线阅读,更多相关《C#验证码.docx(18页珍藏版)》请在冰豆网上搜索。
C#验证码
今天在学习李天平的CodeMatic代码生成器时,看到后台登陆有一个验证码,便看看了,还是比较好用的,特地记录一下,以备他用.
用的时候,自己建立一个aspx文件,把下面的代码复制进去,记得看清楚哦,这个是连Page_Load都有的,覆盖掉原来的就可以了,然后再需要验证码的地方拖一个image服务器控件,src就选择为自己建立的那个aspx文件.你如果觉得自己处理麻烦,可以下载我这个,添加到项目里就可以了(ValidateCode.aspx.rar)
Code
privatevoidPage_Load(objectsender,System.EventArgse)
{
stringcheckCode=GetRandomCode(4);
Session["CheckCode"]=checkCode;
SetPageNoCache();
CreateImage(checkCode);
}
/**////
///设置页面不被缓存
///
privatevoidSetPageNoCache()
{
Response.Buffer=true;
Response.ExpiresAbsolute=System.DateTime.Now.AddSeconds(-1);
Response.Expires=0;
Response.CacheControl="no-cache";
Response.AppendHeader("Pragma","No-Cache");
}
privatestringCreateRandomCode(intcodeCount)
{
stringallChar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,i,J,K,M,N,P,Q,R,S,T,U,W,X,Y,Z";
string[]allCharArray=allChar.Split(',');
stringrandomCode="";
inttemp=-1;
Randomrand=newRandom();
for(inti=0;i {
if(temp!
=-1)
{
rand=newRandom(i*temp*((int)DateTime.Now.Ticks));
}
intt=rand.Next(35);
if(temp==t)
{
returnCreateRandomCode(codeCount);//性能问题
}
temp=t;
randomCode+=allCharArray[t];
}
returnrandomCode;
}
privatestringGetRandomCode(intCodeCount)
{
stringallChar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,i,J,K,M,N,P,Q,R,S,T,U,W,X,Y,Z";
string[]allCharArray=allChar.Split(',');
stringRandomCode="";
inttemp=-1;
Randomrand=newRandom();
for(inti=0;i {
if(temp!
=-1)
{
rand=newRandom(temp*i*((int)DateTime.Now.Ticks));
}
intt=rand.Next(33);
while(temp==t)
{
t=rand.Next(33);
}
temp=t;
RandomCode+=allCharArray[t];
}
returnRandomCode;
}
privatevoidCreateImage(stringcheckCode)
{
intiwidth=(int)(checkCode.Length*14);
System.Drawing.Bitmapimage=newSystem.Drawing.Bitmap(iwidth,20);
Graphicsg=Graphics.FromImage(image);
Fontf=newSystem.Drawing.Font("Arial",10);//,System.Drawing.FontStyle.Bold);
Brushb=newSystem.Drawing.SolidBrush(Color.Black);
Brushr=newSystem.Drawing.SolidBrush(Color.FromArgb(166,8,8));
//g.FillRectangle(newSystem.Drawing.SolidBrush(Color.Blue),0,0,image.Width,image.Height);
// g.Clear(Color.AliceBlue);//背景色
g.Clear(System.Drawing.ColorTranslator.FromHtml("#99C1CB"));//背景色
char[]ch=checkCode.ToCharArray();
for(inti=0;i {
if(ch[i]>='0'&&ch[i]<='9')
{
//数字用红色显示
g.DrawString(ch[i].ToString(),f,r,3+(i*12),3);
}
else
{ //字母用黑色显示
g.DrawString(ch[i].ToString(),f,b,3+(i*12),3);
}
}
//for循环用来生成一些随机的水平线
// PenblackPen=newPen(Color.Black,0);
// Randomrand=newRandom();
// for(inti=0;i<5;i++)
// {
// inty=rand.Next(image.Height);
// g.DrawLine(blackPen,0,y,image.Width,y);
// }
System.IO.MemoryStreamms=newSystem.IO.MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
//historyback不重复
Response.Cache.SetNoStore();//这一句
Response.ClearContent();
Response.ContentType="image/Jpeg";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
想起前些日子看到Terrylee也整理的一个图片验证码(点此查看),不知道怎么用,现在突然一下恍然大悟,原来用法和上面的一样,代码贴出来,我自己修改了一点点
Code
protectedvoidPage_Load(objectsender,EventArgse)
{
/**//**/
/**////调用函数将验证码生成图片
this.CreateCheckCodeImage(GenerateCheckCode());
}
/**//**/
/**////
///产生五位的随机字符串
///
///
privatestringGenerateCheckCode()
{
intnumber;
charcode;
stringcheckCode=String.Empty;
System.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();
}
/**//**/
/**////用于客户端校验码比较
Session["CheckCode"]=checkCode;
returncheckCode;
}
/**//**/
/**////
///将验证码生成图片显示
///
///
privatevoidCreateCheckCodeImage(stringcheckCode)
{
if(checkCode==null||checkCode.Trim()==String.Empty)
return;
System.Drawing.Bitmapimage=newSystem.Drawing.Bitmap((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));
System.Drawing.Drawing2D.LinearGradientBrushbrush=newSystem.Drawing.Drawing2D.LinearGradientBrush(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);
System.IO.MemoryStreamms=newSystem.IO.MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
Response.ClearContent();
Response.ContentType="image/Gif";
Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
}
完整图形验证码程序
1、测试页面:
Default.aspx
<%@PageLanguage="C#"AutoEventWireup="true" CodeFile="Default.aspx.cs"Inherits="_Default"%>
DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http:
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
//www.w3.org/1999/xhtml">
ASP.NET验证码
请输入验证码:
Imageid="Image1"runat="server"ImageUrl="ValidateCode.aspx"ImageAlign="Middle"/>
RequiredFieldValidatorID="RequiredFieldValidator1"runat="server"ErrorMessage="您没有输入验证码"ControlToValidate="txtVI">
RequiredFieldValidator>
ButtonID="Button1"runat="server"Text="提 交"OnClick="Button1_Click"/>