防重复提交和恶意提交之令牌法

有时候我们在页面进行ajax提交的时候,有时候我们会一不小心点击两次提交按钮,这时候如果不作处理就好后台保存两次一模一样的数据。

又或者我们的项目被别人恶意不断提交我们的方法。

下面是用令牌法进行对上面问题的处理:

令牌法身份验证:后台生成一段令牌字符串传到页面,在页面提交的时候把该字符串传回后台验证。

例如:页面有一个from表单提交:

<from>

            <label>名称:<input id="name" /></label>

            <label>年龄:<input id="age" /></label>

            <button id="btn" type="button" >提交</button>

        </from>

我们需要在页面打开的时候从后台获取一个令牌:

后台代码

//生成一个令牌字符串

        private string setoken()

        {

            Random rd = new Random();

            string str = DateTime.Now.ToString() + rd.Next(1000);

            str = System.Web.HttpUtility.UrlEncode(str);

            return str;

        }

        // 页面

        public ActionResult Index()

        {

            string str = settoken();

            ViewBag.tok = str;

            Session["tok"] = str;

            return View();

        }

  页面保存令牌

sessionStorage.setItem("tok", "@ViewBag.tok");

当点击提交按钮时:

$("#btn").click(function () {

            var name = $("#name").val();

            var age = $("#age").val();

            //获取令牌

            var tok = sessionStorage.getItem("tok");

             //把令牌字符串传回后台

            $.post("Submit", { name: name, age: age, tok: tok }, function (data) {

                console.log(data);

            });});

后台方法:

//方法

        public ActionResult Submit(string name, int age, string tok)

        {

            //用try捕获恶意提交,例如Session没有令牌

            try

            {   //获取保存Session中的令牌

                string sesTok = Session["tok"].ToString();

                //判断页面传回来的令牌与Session中的是否一致

                if (sesTok == tok)

                {

                    //修改Session中的令牌,防止重复提交

                    Session["tok"]="";

                    //...业务代码

                    return Json("成功");

                }

                return Json("已重复提交");

            }

            catch (Exception)

            {return Json("失败");}

         }

第一次点击:

第二次点击:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值