今天学了下如何做验证码。
下面说下简单的步骤
1. 新建一个validate.ashx页面,把 ProcessRequest(HttpContext context)的函数体换成一下内容。
context.Response.ContentType = "image/jpeg";
using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(100, 40))
{
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
{
Random rand = new Random();
int code = rand.Next(1000, 9999);
string strCode=code.ToString();
// 如果要让一般处理程序使用Session,必须实现System.Web.SessionState.IRequiresSessionState接口
HttpContext.Current.Session["code"]=strCode;
g.DrawString(strCode,new System.Drawing.Font("宋体",30),System.Drawing.Brushes.Green,new System.Drawing.PointF(0,0));
System.Drawing.Pen pen = (System.Drawing.Pen)System.Drawing.Pens.Red.Clone();
g.DrawLine(pen, new System.Drawing.Point(10, 10), new System.Drawing.Point(20, 20));
bitmap.Save(context.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
上面代码主要用了点GUI的知识,不必深入研究,略知即可。
2. 新建一个Validate.aspx页面,然后再其中<div></div>中,添加一个<img />,使其src属性为第一步中所建页面名称。 如果
想要点击下图片就换一下验证码的话,就可以为<img />加上一个onclick事件使其重新指向第一步中所建页面。
οnclick="this.src='validate.ashx'"
3. 然后运行下第二步中所建页面,就能看到效果。接着在Validate.aspx中添加一个TextBox和一个Button,Button的click响
应函数体如下:
string txtVal = txtValidate.Text;
if (Session["code"].ToString() == txtVal)
{
Response.Write("登录成功!");
}
else
{
Response.Write("登录失败!");
}
4. 好了,结束了。可以运行下Validate.aspx页面,查看下效果。简单吧?但是有个问题,你试一试就知道了。
5. 其实上面还是有个问题的。<img /> onclick事件中,我们把this.src重新赋值为validate.ashx,原本是想让它重新向服务器请求,
服务器重新生成一个验证码显示。但是关键是,我们传过去的仍然是validate.ashx这个页面,当服务器检测到传来的页面还是原
来的页面时,它并不会对此作出响应。所以我们上面所做的验证码仍然无法实现点击下就切换这个效果。对此问题有个方法可以解决。
就是在validate.ashx传给服务器时我们给加上一些参数,但是参数得每次都不一样。根据这个思路,可以js中的随机数来产生参数,
也可以用个时间函数解决问题。我就用个时间函数解决了,图个方便而已。把<img /> onclick事件改成"this.src='validate.ashx?
aaa='+new Date()"。 OK,最终结果出来了。