<%@PageLanguage="C#"%>
<%@ImportNamespace="System.Drawing"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--
1.准备Bitmap对象image:
System.Drawing.Bitmapimage=newSystem.Drawing.Bitmap(iwidth,20);
2.利用Graphics对象g在上面画图:
Graphicsg=Graphics.FromImage(image);
g.DrawString(checkCode,f,b,3,3);
3.然后Response.BinaryWrite输出:
Response.BinaryWrite(ms.ToArray());
优化想法:
将验证码以js脚本可读取的方式发送到客户端;
客户端先出发js脚本的验证,通过后才允许提交;
提供重新获取验证码功能。
-->
<scriptrunat="server">
///<summary>
///输入要求的验证码的位数,返回一个验证码字符串
///</summary>
///<paramname="codeCount">验证码的位数</param>
///<returns>验证码字符串</returns>
privatestringCreateRandomCode(intcodeCount)
{
stringallChar="0,1,2,3,4,5,6,7,8,9,"+
"A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,"+
"a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
string[]allCharArray=allChar.Split(',');
intallCharLen=allCharArray.Length;
stringrandomCode="";
Randomrand=newRandom();
for(inti=0;i<codeCount;i++)
{
randomCode+=allCharArray[rand.Next(0,allCharLen)];
}
returnrandomCode;
}
///<summary>
///根据验证码checkCode画图
///</summary>
///<paramname="checkCode"></param>
privatevoidCreateImage(stringcheckCode)
{
intiwidth=(int)(checkCode.Length*11.5);
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.White);
//g.FillRectangle(newSystem.Drawing.SolidBrush(Color.Blue),0,0,image.Width,image.Height);
g.Clear(Color.Blue);
g.DrawString(checkCode,f,b,3,3);
g.Dispose();
//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);
Response.ClearContent();
Response.ContentType="image/Jpeg";
Response.BinaryWrite(ms.ToArray());
image.Dispose();
//---------缓存验证码,以备验证---------
Session["ValidateCode"]=checkCode;
/*如果希望在挂接该aspx页的页面A.aspx内执行Session的绑定就是白扯!
*A页面首先绑定,然后是确定表达式,此时B.aspx未执行,还没有产生Session呢!
**/
}
protectedvoidPage_Load(objectsender,EventArgse)
{
CreateImage(CreateRandomCode(6));
}
</script>
<htmlxmlns="/1999/xhtml">
<headid="Head1"runat="server">
<title>无标题页</title>
</head>
<body>
</body>
</html>
调用上面的验证程序:
<%@PageLanguage="C#"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<scriptrunat="server">
protectedvoidbtnSend_Click(objectsender,EventArgse)
{
if(Session["ValidateCode"].ToString()!=txtValidateCode.Text)
Response.Write("验证码不正确");
else
Response.Write("登录到新的界面!");
}
</script>
<htmlxmlns="/1999/xhtml">
<headid="Head1"runat="server">
<title>无标题页</title>
</head>
<body>
<formid="form1"runat="server">
<div>
<asp:TextBoxID="txtValidateCode"runat="server"></asp:TextBox>
<imgsrc="ValidateCode.aspx"alt="验证码"/>
<br/>
<asp:ButtonID="btnSend"runat="server"OnClick="btnSend_Click"Text="发送"/></div>
</form>
</body>
</html>