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

(一)验证码模块(随机数字+Session)

2018-03-24 10:08 141 查看
   想做一个用户管理(登录,注册,修改密码等),这个模块中,还包含了另一些模块,比如验证码模块,电子邮件模块。所以,在做用户管理模块之前,我先做好验证码模块。验证码分好几种,首先从最简单的开始随机数字验证开始简单来说其实就是产生随机数字,将几个随机数字拼接起来变成字符串。以下是后台代码(number.cs)

namespace number
{
    public partial class numbers : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack){
                 Label1.Text = getnumbers(4);
            }
            if ( !string.IsNullOrEmpty(HiddenField1.Value))
            {
                Session["numbers"] = HiddenField1.Value;
                Label1.Text = HiddenField1.Value;
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
          
            if(TextBox1.Text.ToString()==Session["numbers"].ToString())
            {
                Response.Write("成功!");
                TextBox1.Text = "";
            }
            else
            {
                Response.Write("失败!");
                TextBox1.Text = "";
                HiddenField1.Value = "";//必须要这个,失败了之后不会采用前面的js代码,但是有可能HIddenFild里面有值,一直失败的话HiddenFild里面的值也不会变,一直错误
                Label1.Text = getnumbers(4);//重新产生随机数字
            }
        }

        public String getnumbers(int n)
        {
            String s="";
            String vail = "0,1,2,3,4,5,6,7,8,9";
            String[] num = vail.Split(',');
            //String[] num={"0","1","2","3","4","5","6","7","8","9"};这样写也可以,但是看书上跟别人的代码都用了上面的方法
            Random ran = new Random();
            for(int i=0;i<n;i++)
            {
                int t = ran.Next(num.Length);//产生一个小于num.Length的数字
                s += num[t];
            }
            Session["numbers"] = s;
            return s;
        }
    }
}
在这部分代码中,我的随机数字并没有使用不产生重复随机数字的方法(使用random这个函数,产生的基本不是重复的,所以我没想太多),如果要产生不重复的随机数字,可以去网上查找资料,修改这部分代码。

number.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>
    <script type="text/javascript">
        function getnumbers(n) {          
            var s="";    
            var num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];                   
            for(var i=0;i<n;i++)
            {
                var t = parseInt(10 * Math.random());  //Math.random()只能生成0~1的小数            
                s += num[t];
            }            
            document.getElementById("Label1").innerHTML = s;//这里不能是.Text,label在客户端会变成<span>,如果不用innerHTML改变不了值          
            

           // Session["numbers"] = s;这个在js里面是没有的
  document.getElementById("HiddenField1").value = s;

           
        }
        function changestyle() {          
            document.getElementById("lab").style.cursor = 'pointer';
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
        <p>
            验证码:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</p>
         <div id="lab" onclick="getnumbers(4)" onmousemove="changestyle()"><asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>          
        <%--<a href="javascript:void(0)" onclick="getnumbers(4)" >看不清,换一张</a> --%>
        <%--  <!-- -->, html comment会包含在最终生成的html文件中
           现在使用的注释,aspx comment 不会包含在最终生成的html文件中 --%>
<asp:HiddenField ID="HiddenField1" runat="server" />

        <asp:Button ID="Button1" runat="server" Text="提交" OnClick="Button1_Click" />
    </form>
</body>
</html>
  这里我写了两个js的事件,一个是点击事件,一个是鼠标移动事件。当鼠标移动到<div id="lab">这里时,首先鼠标会改变它的样式,变成一个手柄形状,然后点击一下,数字就会改变。效果如下(鼠标形状截屏不下来)



  一开始我以为在js里面可以直接使用session,但是后来自己运行的时候出现了错误,然后调试,发现session这个值一直没有变化,才知道session这边出了问题。从js将值传给后台,我使用了一个asp.net的一个隐藏控件,在js中将值赋给它,然后在后台将它读取出来,再保存到session中, 这样,简单的随机数字验证码就实现了。
我的代码放在https://github.com/1126048156/-.git
numbers这部分就是随机数字验证码的代码。

       

    
   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  asp.net