一种利用异常机制基于MVC过滤器的防止重复提交的机制分享
防止重复提交验证机制
某些时候因为系统反应稍慢,急性子用户可能不耐烦会进行重复的提交,这个操作不仅可能造成系统负担,也可能产生垃圾数据。
出现这两种状况都是我们不希望的。
为此,在公司项目系统设计了以下防止反复提交机制,用来避免这种状况。
工作原理
使用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过滤器的防止重复提交的机制分享的更多相关文章
- Spring MVC表单防重复提交
利用Spring MVC的过滤器及token传递验证来实现表单防重复提交. 创建注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RU ...
- spring MVC 后台token防重复提交解决方案
看到公司有个部门提出了这个问题,补个粗略的解决方案... 1.编写拦截器 /** * Description: 防止重复提交 * * @Author liam * @Create Date: 2018 ...
- spring mvc防止表单重复提交的代码片段
1.定义一个token接口 package com.bigbigrain.token; import java.lang.annotation.Documented; import java.lang ...
- 两种利用GCD实现分步获取结果的方式和SDWebImage缓存机制的验证
前段时间写界面,因为数据的请求分成了两部分,所以用到了多线程,实现数据的分步请求,然后自己写了一个Demo,用两种方式实现分步获取内容,其中也包含了验证SDWebImage这个库的缓存机制,在这里给大 ...
- struts2 防止表单重复提交--令牌机制
jsp: action: 配置文件:
- Session机制三(表单的重复提交)
1.表单的重复提交的情况 在表单提交到一个servlet,而servlet又通过请求转发的方式响应了一个JSP页面,这个时候地址栏还保留这servlet的那个路径,在响应页面点击刷新. 在响应页面没有 ...
- SP避免Form重复提交的三种方案
SP避免Form重复提交的三种方案 1) javascript ,设置一个变量,只允许提交一次. <script language="javascript"> ...
- asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码
重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...
- MVC过滤器使用案例:统一处理异常顺道精简代码
重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...
随机推荐
- JAVA进阶-注解
注解元数据分为4部分分别为Target,Documented,Inherited,Retention: Target>指定被注解的注解仅仅能使用在某个类型上;ElementType指定其类型:能 ...
- Android超炫日期日历控件:TimesSquare
先看效果图: 使用说明: 在布局文件里: <com.squareup.timessquare.CalendarPickerView android:id="@+id/calendar_ ...
- 框架Asp.net Identity
框架Asp.net Identity 在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- MVC5 + EF6 + Bootstrap3 (8) HtmlHelper
MVC5 + EF6 + Bootstrap3 (8) HtmlHelper用法大全(上) 上一节:MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统 源码下载:点我 ...
- 数据泵expdp,impdp使用结
EXPDP,IMPDP远程导出,导入数据库到本地 1.本地建立导出用户hr_exp并全然删除机hr的用户 C:\Users\Administrator>sqlplus / as sysdba S ...
- SQL点滴25—T-SQL面试语句,练练手
原文:SQL点滴25-T-SQL面试语句,练练手 1. 用一条SQL语句查询出每门课都大于80分的学生姓名 name kecheng fenshu 张三 语文 81张三 ...
- SSI框架总结
先来点文字性的描写叙述: MVC对于我们来说,已经不陌生了,它起源于20世纪80年代针对smalltalk语言的一种软件设计模式,如今已被广泛应用.近年来,随着java的盛行,MVC的低耦合性.高重用 ...
- 一个极简的守护进程Bash脚本
由于最近写的Node.js程序因为一些Bug,会出现一些自动退出的问题,所以需要在它退出的时候及时发现,并重新启动 于是查阅了些资料,写了一个Bash的程序,功能十分简单,就是每隔3s判断一次处在60 ...
- openSUSE13.1安装Nodejs并更新到最新版
软件源中直接安装Nodejs即可 sudo zypper in nodejs 查看nodejs版本 sincerefly@linux-utem:~> node --version v0.10.5 ...