某些時候由於系統反應稍慢,急性子用戶可能不耐煩會進行重複的提交,這個操做不只可能形成系統負擔,也可能產生垃圾數據。session
出現這兩種情況都是咱們不但願的。ide
爲此,在公司項目系統設計瞭如下防止反覆提交機制,用來避免這種情況。字體
使用MVC Action攔截器,在用戶提交信息時記錄提交時間,並用此時間和上次提交時間對比,若是這個時間小於必定的時間差,則不容許重複提交,異常提示相似:spa
圖:不容許反覆提交的異常設計
/// <summary> /// 防止重複提交過濾器 /// </summary> /// <remarks> /// 跟蹤的順序 /// OnActionExecuting /// OnActionExecuted /// OnResultExecuting /// OnResultExecuted /// </remarks> public class DisabledReSubmitActionAttribute : ActionFilterAttribute { // 不容許重複提交時間間隔 private int m_ReSubmitSeconds = 2; /// <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(-100); } //計算當前時間和上次提交的時間差 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秒內不能夠重複提交,見如下代碼紅色字體。code
[DisabledReSubmitAction(5)]orm
[AcceptVerbs(HttpVerbs.Post)]blog
public ActionResult ReSubmitTest(FormCollection collection)rem
{get
ViewData["Message"] = "方式:POST" + DateTime.Now.ToString();
return View();
}