• 汉字验证码


    有时在注册论坛会员时,网页中的验证码是以汉字形式出现的。汉字验证码技术比字母和数字混合验证码技术更先进。通过汉字验证码,可以有效地防止非法用户灌水。本实例中主要通过生成的汉字区位码,将其转换成汉字。区位码是汉字一一对应的编码,用4位数字表示,前两位从0194称为区码,后两位从0194称为位码,一个汉字的前一半是ASC II码位“160+区码”的字符,后一半是ASC II码“160+位码”的字符。

    今天把主要代码给贴出来供需要的朋友参考下:

    在页面加载时调用相应的方法就可以了:

    protected void Page_Load(object sender, EventArgs e)
    {
    GraphicsImage(
    4); //调用方法生成四位汉字验证码
    }
    private void GraphicsImage(int length)
    {
    System.Drawing.Bitmap image
    = new System.Drawing.Bitmap((int)Math.Ceiling((GetString(length).Length * 22.5)), 22);
    Graphics g
    = Graphics.FromImage(image); //创建画布
    try
    {
    //生成随机生成器
    Random random = new Random();
    //清空图片背景色
    g.Clear(Color.White);
    //画图片的背景噪音线
    for (int i = 0; i < 1; i++)
    {
    int x1 = random.Next(image.Width);
    int x2 = random.Next(image.Width);
    int y1 = random.Next(image.Height);
    int y2 = random.Next(image.Height);

    g.DrawLine(
    new Pen(Color.Black), x1, y1, x2, y2);
    }
    Font font
    = new System.Drawing.Font("Couriew New", 12, System.Drawing.FontStyle.Bold);
    System.Drawing.Drawing2D.LinearGradientBrush brush
    = new System.Drawing.Drawing2D.LinearGradientBrush
    (
    new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
    g.DrawString(GetString(length), font, brush,
    2, 2);
    //画图片的前景噪音点
    for (int i = 0; i < 50; i++)
    {
    int x = random.Next(image.Width);
    int y = random.Next(image.Height);

    image.SetPixel(x, y, Color.FromArgb(random.Next()));
    }
    //画图片的边框线
    g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
    System.IO.MemoryStream ms
    = new System.IO.MemoryStream();
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
    Response.ClearContent();
    Response.ContentType
    = "image/Gif";
    Response.BinaryWrite(ms.ToArray());
    }
    catch (Exception ms)
    {
    Response.Write(ms.Message);
    }
    }
    private string GetString(int length)
    {
    Encoding gb
    = Encoding.GetEncoding("gb2312");
    object[] bytes = CreateString(length);
    //根据汉字字节解码出中文汉字
    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 str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
    string str = str1 + str2 + str3 + str4;
    Response.Cookies.Add(
    new HttpCookie("CheckCode", str));
    return str;
    }
    private object[] CreateString(int strlength)
    {
    //定义一个数组存储汉字编码的组成元素
    string[] str = new string[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
    Random ran
    = new Random(); //定义一个随机数对象
    object[] bytes = new object[strlength];
    for (int i = 0; i < strlength; i++)
    {
    //获取区位码第一位
    int ran1 = ran.Next(11, 14);
    string str1 = str[ran1].Trim();
    //获取区位码第二位并防止数据重复
    ran = new Random(ran1 * unchecked((int)DateTime.Now.Ticks) + i);
    int ran2;
    if (ran1 == 13)
    {
    ran2
    = ran.Next(0, 7);
    }
    else
    {
    ran2
    = ran.Next(0, 16);
    }
    string str2 = str[ran2].Trim();
    //获取区位码第三位
    ran = new Random(ran2 * unchecked((int)DateTime.Now.Ticks) + i);
    int ran3 = ran.Next(10, 16);
    string str3 = str[ran3].Trim();
    //获取区位码第四位
    ran = new Random(ran3 * unchecked((int)DateTime.Now.Ticks) + i);
    int ran4;
    if (ran3 == 10)
    {
    ran4
    = ran.Next(1, 16);
    }
    else if (ran3 == 15)
    {
    ran4
    = ran.Next(0, 15);
    }
    else
    {
    ran4
    = ran.Next(0, 16);
    }
    string str4 = str[ran4].Trim();
    //定义字节变量存储产生的随机汉字区位码
    byte byte1 = Convert.ToByte(str1 + str2, 16);
    byte byte2 = Convert.ToByte(str3 + str4, 16);
    byte[] stradd = new byte[] { byte1, byte2 };
    //将产生的汉字字节放入数组
    bytes.SetValue(stradd, i);
    }
    return bytes;
    }

    以上就是生成汉字验证码的自定义方法。具体怎样在页面中使用可以QQ我

  • 相关阅读:
    [转载]ORACLE删除重复记录方法
    [转载]JAVA开发者最常去的20个英文网站
    [转载]Java常见异常汇总
    [转载]ORACLE删除重复记录方法
    《〈XNova/OGame〉源码笔记》(1-2)
    三拳两脚安装LUA
    一起复习几何(3)
    《〈XNova/OGame〉源码笔记》(3-4)
    喜迎四十万访问量,自荐十六篇好博文
    三招两式搞定修改VC项目名
  • 原文地址:https://www.cnblogs.com/wangsaiming/p/2091256.html
Copyright © 2020-2023  润新知