认证码是网站开发中经常使用的一种技术,它的目的是保证登录网站的是人而不是程序,防止某些人利用程序自动登录网站下载资料,过多占用网络带宽和服务器资源。
首先,新建一个生成认证码数字的类CreateImgValidateCode,附代码如下:
public class CreateImgValidateCode
{
private Bitmap img = null;
private Graphics g=null;
private Bitmap imgClone = null;
private bool isClone = false;
private string _validateCode=String.Empty;
private HttpContext _context=null;
private int _imgWidth=40;
private int _imgHeight=16;
private string _defaultPicUrl="../img/imgcode1.jpg"; //认证码的背景图片
public CreateImgValidateCode()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public bool IsReusable
{
get { return true; }
}
public HttpContext WriteContext
{
set
{
_context=value;
}
}
public int ImageWidth
{
set
{
_imgWidth=value;
}
}
public int ImageHeight
{
set
{
_imgHeight=value;
}
}
public string DefaultPicUrl
{
set
{
_defaultPicUrl=value;
}
}
public void ProcessRequest()
{
if(_context==null)
{
throw new Exception("非法调用");
}
_validateCode=GetCurrentValidateCode();
_context.Session["ValidateCode"]=_validateCode;
WriteValidateCode(_validateCode);
}
public string ValidateCode
{
get
{
return _validateCode;
}
}
private string GetCurrentValidateCode()
{
Random rd = new Random();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(rd.Next(9));
sb.Append(rd.Next(9));
sb.Append(rd.Next(9));
sb.Append(rd.Next(9));
return sb.ToString();
}
private void WriteValidateCode(string num)
{
if(g==null)
{
img = new Bitmap(_imgWidth,_imgHeight);
g = Graphics.FromImage(img);
string imgPath = _context.Server.MapPath(_defaultPicUrl);
System.Drawing.Image bgImg = new Bitmap(imgPath,true);
g.DrawImage(bgImg,0,0,_imgWidth,_imgHeight);
imgClone = (Bitmap)img.Clone();
isClone = true;
}
else
{
if(isClone)
{
img = (Bitmap)imgClone.Clone();
g = Graphics.FromImage(img);
}
}
g.DrawString(num,new Font("Arial",9),new SolidBrush(Color.Blue),4,2,System.Drawing.StringFormat.GenericTypographic);
img.Save(_context.Response.OutputStream,ImageFormat.Gif);
g.Dispose();
}
}
再新建一个页面CreateImageValidateCode,在页面的Page_Load中加入如下代码:
if(!Page.IsPostBack)
{
CreateImgValidateCode c=new CreateImgValidateCode();
c.WriteContext=this.Context;
c.ProcessRequest();
}
现在就可以在需要认证码的页面加入一个image控件和一个文本框控件(用户输入认证码),并将这个控件的图像源设为上面新建的CreateImageValidateCode页面,认证码功能已经实现了,最后只要在这个页面的代码里加入判断输入值是否等于系统生成的值,如果等就可以进入下面的判断,不等给出错误信息并返回,(认证码值生成后存储在服务器的Session中)如下:
if(this.sn2.Text!=Session["ValidateCode"].ToString())
{
Response.Write("<script>alert('错误的验证码,请重新输入!');</script>");
this.sn2.Text="";
return;
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=535527