在做管理系统时候,我们时常要使用验证码对用户的一些操作进行验证,增加系统的安全性。以下是asp.net中生成验证码的部分。个人觉得使用原生态的httpHandler文件生成验证码比使用.aspx文件生成验证码要好很多,.aspx文件中。page类是一个很大的类。page类也实现了IHttpHandler接口。
新建一个一般处理程序文件Code.ashx,在里面加入如下代码。
public class Handler : IHttpHandler,System.Web.SessionState.IRequiresSessionState
{
///生成随机验证码
public string GetCode(int number)
{
string s = "0AaB1oCb3pqD2cErf4dFs5GetHI6gu7JKLvhMwNixO8PyQj9zRSkTUVlWmXYnZ";
Random rand=new Random();
StringBuilder code=new StringBuilder();
for(int i=0;i<number;i++)
{
char word=s[rand.Next(s.Length)];
code.Append(word.ToString());
}
return code.ToString();
}
///.httpHandler文件请求入口函数,context表示当前请求的上下文信息(或者成为当前请求的环境)
public void ProcessRequest(HttpContext context)
{
string code = GetCode(4);//获取长度为4的随机验证码
context.Session["Code"] = code;
Bitmap Image = new Bitmap(120, 40);
Graphics g = Graphics.FromImage(Image);
try
{
g.Clear(Color.White);//清除背景色
Random rand = new Random();
for (int i = 0; i < 30; i++)//画噪线
{
int x1 = rand.Next(Image.Width);
int x2 = rand.Next(Image.Width);
int y1 = rand.Next(Image.Height);
int y2 = rand.Next(Image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);//指定画笔,指定矩形中 画线的起始点和终点坐标
}
Font font = new Font("Arial", 20, FontStyle.Italic);///声明字体
//画刷,第一个参数指定画刷作用范围矩形,第二个参数表示起始位置颜色,第三个参数表示表示终止位置颜色,第四个表示偏离角度,第五个表示是否颜色渐变
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, Image.Width, Image.Height), Color.Blue, Color.DarkRed, 5, true);
g.DrawString(code, font, brush, 3, 2);
g.DrawRectangle(new Pen(Color.Silver), 0, 0, Image.Width - 1, Image.Height - 1);
System.IO.MemoryStream stream = new System.IO.MemoryStream();
Image.Save(stream, ImageFormat.Gif);
context.Response.Clear();//清空Response中的数据缓存
context.Response.ContentType = "image/Gif";
context.Response.BinaryWrite(stream.ToArray());//输出内存流
}
finally
{
g.Dispose();
Image.Dispose();
}
}
public bool IsReusable {
get {
return false;
}
}
}
在客户端页面,我们使用原生态的html标签生成验证码,使用<img>标签即可,如下
<img src=\'#\'" alt="单击图片换一个验证码." style="cursor: pointer" onclick=""http://blog.51cto.com/viewpic.php?refimg=" + this.src=\'#\'" Date()" />
在<img>标签中的onclick事件中我们使用javascript改变img标签的src属性,没单击一次,<img>就会重新请求一次Code.ashx文件,因为new Date()总是获取当前时间,没单击一次"http://blog.51cto.com/viewpic.php?refimg=" + this.src后面的date参数都会变化,浏览器就会认为这是一个新的网址,进而重新请求一次。(如果网址后没有?date=new Date(),浏览器将不会请求,也就是说验证码不会变化)。