有时候我们在页面进行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("失败");}
}
第一次点击:
第二次点击: