C#一般处理程序防止表单重复提交

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+请求时间+请求参数,在下次请求时获取存取的值进行比对,判断请求时间间隔即可,以上,欢迎各位同僚借鉴,也欢迎各位大佬指正。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值