一種利用異常機制基於MVC過濾器的防止重複提交的機制分享

防止重複提交驗證機制

某些時候由於系統反應稍慢,急性子用戶可能不耐煩會進行重複的提交,這個操做不只可能形成系統負擔,也可能產生垃圾數據。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();

    }

相關文章
相關標籤/搜索