生成验证码

    在做管理系统时候,我们时常要使用验证码对用户的一些操作进行验证,增加系统的安全性。以下是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(),浏览器将不会请求,也就是说验证码不会变化)。


你可能感兴趣的:(asp.net,验证码)