防止重复提交验证机制

某些时候因为系统反应稍慢,急性子用户可能不耐烦会进行重复的提交,这个操作不仅可能造成系统负担,也可能产生垃圾数据。

出现这两种状况都是我们不希望的。

为此,在公司项目系统设计了以下防止反复提交机制,用来避免这种状况。

工作原理

使用MVC Action拦截器,在用户提交信息时记录提交时间,并用此时间和上次提交时间对比,如果这个时间小于一定的时间差,则不允许重复提交,异常提示类似:

图:不允许反复提交的异常

拦截器代码:

 /// <summary>
/// 防止重复提交过滤器
/// </summary>
/// <remarks>
/// 跟踪的顺序
/// OnActionExecuting
/// OnActionExecuted
/// OnResultExecuting
/// OnResultExecuted
/// </remarks>
public class DisabledReSubmitActionAttribute : ActionFilterAttribute
{
// 不允许重复提交时间间隔
private int m_ReSubmitSeconds = ;
/// <summary>
/// 构建方法
/// </summary>
/// <param name="reSubmitSeconds">不允许重复提交的时间间隔:秒</param>
public DisabledReSubmitActionAttribute(int reSubmitSeconds)
{
m_ReSubmitSeconds = reSubmitSeconds;
} /// <summary>
/// 在controller action执行之前调用
/// </summary>
/// <param name="filterContext">controller action内容</param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var session = filterContext.HttpContext.Session;
//第一次加载
if (session["lastSubmitTime"] == null)
{
session["lastSubmitTime"] = DateTime.Now.AddSeconds(-);
} //计算当前时间和上次提交的时间差
TimeSpan ts = DateTime.Now - (DateTime)session["lastSubmitTime"]; //n 秒内不允许重复提交
if (ts.TotalSeconds < m_ReSubmitSeconds)
{
// 抛出重复提交异常
throw new AppExReSubmit(m_ReSubmitSeconds); }
else
{
//更新保存的时间值
session["lastSubmitTime"] = DateTime.Now;
// 继续执行Action
base.OnActionExecuting(filterContext);
}
} }

使用方式(示例)

使用该拦截器只要在提交处理的Action方法上声明该过滤器属性即可,其中参数5表示5秒内不可以重复提交,见以下代码红色字体。

        [DisabledReSubmitAction(5)]

[AcceptVerbs(HttpVerbs.Post)]

public ActionResult ReSubmitTest(FormCollection collection)

{

ViewData["Message"] = "方式:POST" + DateTime.Now.ToString();

return View();

}

一种利用异常机制基于MVC过滤器的防止重复提交的机制分享的更多相关文章

  1. Spring MVC表单防重复提交

    利用Spring MVC的过滤器及token传递验证来实现表单防重复提交. 创建注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RU ...

  2. spring MVC 后台token防重复提交解决方案

    看到公司有个部门提出了这个问题,补个粗略的解决方案... 1.编写拦截器 /** * Description: 防止重复提交 * * @Author liam * @Create Date: 2018 ...

  3. spring mvc防止表单重复提交的代码片段

    1.定义一个token接口 package com.bigbigrain.token; import java.lang.annotation.Documented; import java.lang ...

  4. 两种利用GCD实现分步获取结果的方式和SDWebImage缓存机制的验证

    前段时间写界面,因为数据的请求分成了两部分,所以用到了多线程,实现数据的分步请求,然后自己写了一个Demo,用两种方式实现分步获取内容,其中也包含了验证SDWebImage这个库的缓存机制,在这里给大 ...

  5. struts2 防止表单重复提交--令牌机制

    jsp: action: 配置文件:

  6. Session机制三(表单的重复提交)

    1.表单的重复提交的情况 在表单提交到一个servlet,而servlet又通过请求转发的方式响应了一个JSP页面,这个时候地址栏还保留这servlet的那个路径,在响应页面点击刷新. 在响应页面没有 ...

  7. SP避免Form重复提交的三种方案

    SP避免Form重复提交的三种方案  1) javascript ,设置一个变量,只允许提交一次.   <script language="javascript">  ...

  8. asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码

    重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...

  9. MVC过滤器使用案例:统一处理异常顺道精简代码

    重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...

随机推荐

  1. 关于tcp封装http协议

    如果tcp中没有上层协议,那么就是简单的数据包的传输,如果tcp中有上层协议,那么,当客户端把tcp包发给server的时候,server端的socket收到数据包后,从中分离出应用层协议,交给上层继 ...

  2. 登录记住账号和密码小Demo

    读取 // 1.读取沙盒中plist文件 // 1.1.获得沙盒根路径 NSString *home = NSHomeDirectory(); // 1.2.拼接Documents路径 NSStrin ...

  3. Linux 下 简单客户端服务器通讯模型(TCP)

    原文:Linux 下 简单客户端服务器通讯模型(TCP) 服务器端:server.c #include<stdio.h> #include<stdlib.h> #include ...

  4. 使用Net.Mail、CDO组件、JMail组件三种方式发送邮件

    原文:使用Net.Mail.CDO组件.JMail组件三种方式发送邮件 一.使用Net.Mail 需要服务器认证,大部分服务器端口为25. { MailMessage mailMsg = mailMs ...

  5. Java之多线程

    一.简述进程与线程的关系   说到多线程就不得不说进程,那么什么是进程:简单的来说就是正在进行中的程序. 在windows中,我们可以直观的看到的正在运行中的程序,即进程,如图:

  6. 新手可以学习cocos2dx 3.0 组态(两)

    这主要是关于cocos3.0 组态,鉴于互联网已经有很多这样的文章.所以我简单谈一下: 1.python2.7 因为cocos目新建是用python脚本做的,至于为什么不用python3.x  那么请 ...

  7. 增加VMWare开机画面时间,来防止快速跳过而无法进入BIOS

    用记事本打开xx.vmx,在里面添加一行: bios.bootDelay = "30000" 意思是开机后,在开机画面里停留30秒.

  8. 【转】NuGet的安装与使用

    学习了一段时间的MVC,今天想自己尝试初步搭建一个MVC框架,结果新建MVC4.0(MVC3.0同样)项目时,弹出一个错误提示框,如下图.上网一搜,说是要安装一个第三方组件NuGet.刚接触MVC,更 ...

  9. leetcode[60] Rotate List

    题目:给定链表,和一个k,把链表的后k个旋转到前头,例如链表为: 1->2->3->4->5->NULL and k = 2, return 4->5->1- ...

  10. orcale复制表结构及其数据

    http://hi.baidu.com/tag/Oracle/feeds http://hi.baidu.com/gqftuisidibabiq/item/14d306cc87cbdf45bcef69 ...