C#一般处理程序防止表单重复提交
前言
最近部分用户反馈数据库有重复的情况,且时间较短,几乎在3秒之内,通过打日志发现是由于请求端没做请求校验,于是考虑到接口的健硕及安全,最主要的是某客户SB一样的电话轰炸及其工作群里的各种@,废话不多说,接下来说下解决思路及代码实现。
提示:以下是本篇文章正文内容,下面案例可供参考
一、问题排查及定位
项目是使用安卓PDA(OKHTTP框架)调用后台一般处理进行数据业务逻辑处理(数据的操作),在经过几个小时的日志排查,发现某些时候由于数据库的事务锁,接口处理数据可能就没那么理想,就会产生数据重复提交的情况(业务逻辑有些是需要重复的,所以不能通过数据库唯一键来约束),排查出问题,接下来就是代码的实现了,处于职业本能首先想到的当然是CV啦,可以事不如人愿,在网上划水了几个小时还是没找到理想的解决方案,由于本人之前从事的大多是Java开发相关工作,在接口方面也略有研究,于是打算小小的尝试一番。
二、具体实现及效果
1.代码实现
防止表单重复提交代码如下:
获取上次的请求时间,限制同IP访问间隔
object obj = context.Cache.Get(context.Request.UserHostAddress);
if (obj != null)
{
string values = obj.ToString();
//如果3秒内有重复的数据,就判定为重复请求,不处理
if ((DateTime.Now - DateTime.Parse(values.Split('#')[0])).TotalSeconds
< 3 && values.Split('#')[1] == data)
{
string msg = JsonResult.CreateJStrForData("false", "正在提交,请勿频繁操作,间隔3秒!", "");
context.Response.Write(msg);
context.Response.End();
}
else
{
//测试了insert如果存在会更新存在的值
context.Cache.Insert(context.Request.UserHostAddress, DateTime.Now + "#" + data);
}
}
else
{
context.Cache.Insert(context.Request.UserHostAddress, DateTime.Now + "#" + data);
}
try
{
context.Response.Write(Common._Instance.ExecuteMethod(className, methodName, data));
}
catch { throw; }
}
catch (Exception ex)
{
context.Response.Write(JsonData.CreateJStrForData("false", ex.Message, ""));
}
总结
最后总结:
本方案主要利用HttpContext类下的缓存Cache属性来实现,通过存取调用方(PDA)的IP+请求时间+请求参数,在下次请求时获取存取的值进行比对,判断请求时间间隔即可,以上,欢迎各位同僚借鉴,也欢迎各位大佬指正。