您的位置:首页 > 编程语言 > ASP

(三)验证码模块(随机汉字+session)

2018-03-24 16:11 134 查看
     GB2312编码适用于汉字处码理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。每个汉字由四个区位码组成。
 通过查阅资料,我们可以知道,GB2312编码范围:A1A1-FEFE,其中汉字编码范围:B0A1-F7FE。也就是说第15区也就是AF区以前都没有汉字,只有少量符号,汉字都从第16区B0开始,并且从区位D7开始以后的汉字都是和很难见到的繁杂汉字,所以这些都要排出掉(第一个数在(11,14)产生)。所以随机生成的汉字十六进制区位码第1位范围在B、C、D之间,如果第1位是D的话,第2位区位码就不能是7以后的十六进制数(如果r1产生的随机数如果等于13,那么r2要从(0,8)产生随机数,否则从(0,16)中产生)。在来看看区位码表发现每区的第一个位置和最后一个位置都是空的,没有汉字,因此随机生成的区位码第3位如果是A的话,第4位就不能是0(如果r3等于10,那么r4就要从(1,16)产生随机数);第3位如果是F的话,第4位就不能是F(如果r3等于15,那么r4就要从(0,15)产生随机数),如果r3不符合这两个条件,r4就从(0,16)中产生。
Chinese.aspx.代码

namespace number
{
    public partial class Chinese : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Label1.Text = display();
            }
          
        }

        protected void Button1_Click1(object sender, EventArgs e)
        {
            if (TextBox1.Text.ToString() == Session["chinese"].ToString())
            {
                Response.Write("成功!");
                TextBox1.Text = "";
            }
            else
            {
                Response.Write("失败!");
                TextBox1.Text = "";              
                Label1.Text = display();//重新产生随机数字
            }
        }
        private static object[] getchinesecode(int n)
        {
            String[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
            object[] bytes = new object
;
            Random rnd = new Random();
            for (int i = 0; i < n; i++)
            {
                int r1 = rnd.Next(11, 14);//B0-F7,汉字都从第16区B0开始,并且从区位D7开始以后的汉字都是和很难见到的繁杂汉字
                string str_r1 = rBase[r1].Trim();
                int r2;
                if(r1==13)//如果第1位是D的话,第2位区位码就不能是7以后的十六进制数
                {
                    r2 = rnd.Next(0, 8);
                }
                else
                {
                     r2 = rnd.Next(0, 16);
                }
                string str_r2 = rBase[r2].Trim();
                int r3 = rnd.Next(10, 16);//A1-FE
                string str_r3 = rBase[r3].Trim();
                int r4;
                if(r3==10)
                {
                     r4 = rnd.Next(1, 16);//每区的第一个位置,没有汉字,因此随机生成的区位码第3位如果是A的话,第4位就不能是0
                }
                else if(r3==15)
                {
                     r4 = rnd.Next(0, 15);//最后一个位置都是空的,没有汉字,第3位如果是F的话,第4位就不能是F
                }
                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 };
                bytes.SetValue(str_r, i);
            }
            return bytes;
        }
        public String display()
        {
            Encoding gb = Encoding.GetEncoding("gb2312");//引用System.Text这个命名空间,获取GB2编码表
            object[] bytes = getchinesecode(4);
            string s = String.Empty;
            foreach (object byt in bytes)
            {
                String str1 = gb.GetString((byte[])Convert.ChangeType(byt, typeof(byte[])));
                s = s + str1;
            }
            Session["chinese"] = s;
            return s;
        }   }}
随机中文相较于前面的难很多,需要把产生汉字的区位码了解清楚,然后才能动手写。
chinese.aspx代码
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>随机中文验证</title>
  
</head>
<body>
    <form id="form1" runat="server">   
        <p>
            验证码:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </p>
         <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>        
        <%--<a href="javascript:void(0)" onclick="getletters(4)" >看不清,换一张</a> --%>
        <%--  <!-- -->, html comment会包含在最终生成的html文件中
           现在使用的注释,aspx comment 不会包含在最终生成的html文件中 --%>       
        <asp:Button ID="Button1" runat="server" Text="提交" OnClick="Button1_Click1"  />
    </form>
</body>

</html>
在这个地方我没有写js代码,我尝试了一下网上js产生随机中文的方法,<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>随机中文验证</title>
  
</head>
<body>
    <form id="form1" runat="server">   
        <p>
            验证码:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </p>
         <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>        
        <%--<a href="javascript:void(0)" onclick="getletters(4)" >看不清,换一张</a> --%>
        <%--  <!-- -->, html comment会包含在最终生成的html文件中
           现在使用的注释,aspx comment 不会包含在最终生成的html文件中 --%>       
        <asp:Button ID="Button1" runat="server" Text="提交" OnClick="Button1_Click1"  />
    </form>
</body>
</html>
  在这里我没有写点击事件的js代码,eval( "var word=" +  '"\\u' + (Math.round(Math.random() * 20901) + 19968).toString(16)+'"');会产生很多罕见的中文,所以我并没有使用它。(在接下来图文验证中,可以实现点击操作)。  实际上,大部分网站中的验证码都采用图文验证的方式对用户的登录操作进行验证。所以,接下来,我会写生成图文验证码背景图片的程序。将我们前面产生的随机的数字,英文,中文放进图片中,就形成了图文验证。代码https://github.com/1126048156/-.git
中文验证在chinese部分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  asp.net