博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
验证码的例子(转)
阅读量:4676 次
发布时间:2019-06-09

本文共 2809 字,大约阅读时间需要 9 分钟。

    今天做了几个例子,是关于验证码的,其实验证码不难,你只要理解它的组成,就能学明白了。看了几个例子发现了验证码其实就是一个页面。比如我们有两个页 面,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();

    }

转载于:https://www.cnblogs.com/furenjian/articles/2883742.html

你可能感兴趣的文章
第11周表格
查看>>
linux运维云计算课程学习,Linux云计算面试时遇到的问题
查看>>
Abiword对话框资源
查看>>
跟我一起写 Makefile
查看>>
C# uri
查看>>
GPS定位 测试
查看>>
前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查
查看>>
探索从 MVC 到 MVVM + Flux 架构模式的转变
查看>>
tornado的异步效果
查看>>
*2.3.2_加入env
查看>>
JS中SetTimeOut和SetInterval方法的区别?
查看>>
Protocol Buffers proto语言语法说明
查看>>
Hibernate双向一对一对象关系模型映射
查看>>
正则表达式(下)
查看>>
熟悉常用的HDFS操作
查看>>
Linux自动化运维第十八课
查看>>
web 10
查看>>
jquery--动态篇
查看>>
npm 是干什么的
查看>>
Android开发之蓝牙(Bluetooth)操作(一)--扫描已经配对的蓝牙设备
查看>>