验证码的例子(转)

    今天做了几个例子,是关于验证码的,其实验证码不难,你只要理解它的组成,就能学明白了。看了几个例子发现了验证码其实就是一个页面。比如我们有两个页 面,code.aspx和png.aspx,这里我们假设code就是所谓我们发帖的地方,在此页面我们放个image控件,

  <asp:Image ID="Image1" runat="server" ImageUrl="png.aspx" />

这里我们发现什么了呢?

很简单,就是我们生成随机数和干扰图片都是在一个页面内完成的。做好这个,我们就能往下做了,这里很简单了下面我们就来做一个简单的例子就行了,生成随机汉字的吧。

    我们建个网站就叫confirmcode,然后在里面建了连个页面code.aspx和png.aspx。如图验证码的例子

在这里code.aspx我们展示,png的动态生成样式。

我们首先设计png.aspx让其生成一个随机汉字字符串。这里编写了两个方法。

public static object[] CreateRegionCode(int strlength)

{
        //定义一个字符串数组储存汉字编码的组成元素
        string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

        Random rnd = new Random();

        //定义一个object数组用来
        object[] bytes = new object[strlength];
       
        for (int i = 0; i < strlength; i++)
        {
            //区位码第1位
            int r1 = rnd.Next(11, 14);
            string str_r1 = rBase[r1].Trim();

            //区位码第2位
            rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机数发生器的种子避免产生重复值
            int r2;
            if (r1 == 13)
            {
                r2 = rnd.Next(0, 7);
            }
            else
            {
                r2 = rnd.Next(0, 16);
            }
            string str_r2 = rBase[r2].Trim();

            //区位码第3位
            rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
            int r3 = rnd.Next(10, 16);
            string str_r3 = rBase[r3].Trim();

            //区位码第4位
            rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
            int r4;
            if (r3 == 10)
            {
                r4 = rnd.Next(1, 16);
            }
            else if (r3 == 15)
            {
                r4 = rnd.Next(0, 15);
            }
            else
            {
                r4 = rnd.Next(0, 16);
            }
            string str_r4 = rBase[r4].Trim();

            //定义两个字节变量存储产生的随机汉字区位码
            byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
            byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);
            //将两个字节变量存储在字节数组中
            byte[] str_r = new byte[] { byte1, byte2 };

            //将产生的一个汉字的字节数组放入object数组中
            bytes.SetValue(str_r, i);

        }

        return bytes;

    }


    private string stxt()
    {
        Encoding gb = Encoding.GetEncoding("gb2312");
        //调用函数产生4个随机中文汉字编码
        object[] bytes = CreateRegionCode(3);
        //根据汉字编码的字节数组解码出中文汉字
        string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
        string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
        string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
        string txt = str1 + str2 + str3;
        return txt;
    }

这样我们在该页面的load事件里调用这个方法就可以了

    private readonly string ImagePath = "Validator.jpg";
    private static string gif = "";
    protected void Page_Load(object sender, EventArgs e)
    {
        gif = stxt();
       
        ///创建Bmp位图
        Bitmap bitMapImage = new System.Drawing.Bitmap(Server.MapPath(ImagePath));
        Graphics graphicImage = Graphics.FromImage(bitMapImage);
       
        ///设置画笔的输出模式
        graphicImage.SmoothingMode = SmoothingMode.HighSpeed;
       
        ///添加文本字符串
        graphicImage.DrawString(gif, new Font("Georgia", 20, FontStyle.Bold), SystemBrushes.WindowText, new Point(5, 5));
       
        ///设置图像输出的格式
        Response.ContentType = "image/jpeg";
       
        ///保存数据流
        bitMapImage.Save(Response.OutputStream, ImageFormat.Jpeg);
       
        ///释放占用的资源
        graphicImage.Dispose();
        bitMapImage.Dispose();

    }

posted @ 2013-01-30 22:19  金虹巴巴  阅读(222)  评论(0编辑  收藏  举报