利用IHttpHandler生成验证码

在网站的设计中,验证码是十分有用的,这里利用IHttpHandler生成验证码,代码如下:

<%@ WebHandler Language="C#" Class="Handler2" %>

using System;
using System.Web;
using System.Drawing;
using System.IO;
using System.Web.SessionState;

public class Handler2 : IHttpHandler,IRequiresSessionState{
    
    public void ProcessRequest (HttpContext context) {
        int codeWeight = 80;
        int codeHeight = 22;
        int fontSize = 16;
        Random rd=new Random();
        string checkCode =CreateCode(); //构建验证码字符串
        Bitmap image = new Bitmap(codeWeight,codeHeight); //构建画图
        Graphics g = Graphics.FromImage(image); //构建画布
        g.Clear(Color.White); //清空背景色
        Color[] color = new Color[] {Color.Red,Color.Black,Color.Green,Color.Blue };
        string[] font = new string[] { "宋体", "黑体", "楷体" };
        //画噪音线
        for (int i = 0; i < 2; i++)
        {
            int x1 = rd.Next(image.Width);
            int x2 = rd.Next(image.Width);
            int y1 = rd.Next(image.Height);
            int y2 = rd.Next(image.Height);
            g.DrawLine(new Pen(color[rd.Next(color.Length)]), new Point(x1, y1), new Point(x2, y2));
        }
        //画验证码
        for (int i = 0; i < checkCode.Length; i++)
        {
            Color clr = color[rd.Next(color.Length)];
            Font ft = new Font(font[rd.Next(font.Length)], fontSize);
            g.DrawString(checkCode[i].ToString(), ft, new SolidBrush(clr),(float)i * 18 + 2, 0);
        }
        //画噪音点
        for (int i = 0; i < 100; i++)
        {
            int x = rd.Next(image.Width);
            int y = rd.Next(image.Height);
            image.SetPixel(x,y,Color.FromArgb(rd.Next()));
        }
        //画边框线
        g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
        MemoryStream ms = new MemoryStream();
        try
        {
            image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
            context.Session["checkCode"] = checkCode; //将验证码保存到Session中
            context.Response.ContentType = "Image/Gif";
            context.Response.ClearContent();
            context.Response.BinaryWrite(ms.ToArray());
        }
        finally
        {
            image.Dispose();
            g.Dispose(); 
        }
        
    }
    /// <summary>
    /// 随机构建验证码方法
    /// </summary>
    /// <returns>返回验证码字符串</returns>
    public string CreateCode()
    {
        char code;
        string checkCode = string.Empty;
        Random rd = new Random();
        for (int i = 0; i < 4; i++)
        {
            int num=rd.Next();
            if (num%2==0)
            {
                code = (char)('0' + (char)(num % 10));
            }
            else
            {
                code = (char)('A' + (char)(num % 26));
                if (rd.Next(0,2)==0)
                {
                    code = (char)(code + 32);
                }
            }
            checkCode += code;
        }
        return checkCode;
    }
    public bool IsReusable {
        get {
            return false;
        }
    }

}

 然后将html控件中的img控件的src属性设置为Handler2.ashx就可以了。

<img id="img" src="Handler2.ashx"  alt="点击切换验证码" />

然后再通过javascript生成点击切换事件,这样网站验证码就做好了。

<script language="javascript" type="text/javascript">
            window.onload = function () {
            document.getElementById("img").onclick = function () {
                this.src = "Handler2.ashx" + "?time=" + Math.random();
            }
        }
       
    </script>

posted on 2013-02-22 14:04  MisterS  阅读(338)  评论(0编辑  收藏  举报

导航