当前位置: 代码迷 >> ASP.NET >> ASP.NET如何防止重复提交!
  详细解决方案

ASP.NET如何防止重复提交!

热度:1538   发布时间:2013-02-26 00:00:00.0
ASP.NET怎么防止重复提交!!
如何防止用户连续点击多下BUTTON后将数据插入到数据库中

------解决方案--------------------------------------------------------
C# code
public class RefreshServe : System.Web.UI.Page    {        private static ILog log = LogManager.GetLogger(typeof(RefreshServe));        private readonly string REFRESH_TICKET_NAME = "__RefreshTicketArray";        private readonly string HIDDEN_FIELD_NAME = "__RefreshHiddenField";        private readonly string HIDDEN_PAGE_GUID = "__RefreshPageGuid";        /// <summary>        /// 为True表示页面刷新,False为正常提交        /// </summary>        public bool IsPageRefreshed        {            get            {                if (IsPostBack && !CheckRefreshFlag())                {                    log.Debug("刷新了页面");                    return true;                }                else                {                    log.Debug("正常提交");                    return false;                }            }        }        /// <summary>        /// 呈现前更新标识        /// </summary>        /// <param name="e"></param>        protected override void OnPreRender(EventArgs e)        {            log.Debug("执行OnPreRender");            base.OnPreRender(e);            UpdateRefreshFlag();        }        /// <summary>        /// 更新标识,正常提交都删除该次提交的时间,并生产当前新的时间        /// </summary>        private void UpdateRefreshFlag()        {            #region Cookie模式            //注册页面唯一标识并返回            string pageGuid = SetCurPageGuid();            HttpCookie cookie = GetRefreshTicket();                       if (cookie.Values.Count > 0)            {                cookie.Values.Remove(pageGuid);                log.Debug("当前清除的cookie变是:" + pageGuid);            }            string submitTime = DateTime.Now.ToString("hhmmss.fffff");            //当前提交时间保存到隐藏域            ClientScript.RegisterHiddenField(HIDDEN_FIELD_NAME, submitTime);            log.Debug("即将要新增的时间:submitTime:" + submitTime + "  Guid:" + pageGuid.ToString());            cookie.Values.Add(pageGuid, submitTime);            log.Debug("UpdateRefreshFlag中当前Cookie中存在的记录数为:" + cookie.Values.Count);            for (int i = 0; i < cookie.Values.Count; i++)                log.Info("cookie[" + cookie.Values.GetKey(i) + "]:" + cookie.Values[i]);            Response.AppendCookie(cookie);            #endregion        }        /// <summary>        /// 验证是否刷新        /// </summary>        /// <returns></returns>        private bool CheckRefreshFlag()        {            HttpCookie cookie = GetRefreshTicket();            string pageGuid = GetCurPageGuid();            if (cookie.Values.Count > 0)            {                bool flag;                if (cookie.Values[pageGuid] != null)                    flag = cookie.Values[pageGuid].IndexOf(GetCurSubmitTime()) > -1;                else                    flag = true;//防止出现异常,总是可以提交                if (flag)                    log.Debug("提交时间存在,可以提交");                else                    log.Debug("无效的提交时间");                return flag;            }            return true;        }        /// <summary>        /// 得到已保存的提交时间,没有新建,有返回        /// </summary>        /// <returns></returns>        private HttpCookie GetRefreshTicket()        {                        #region Cookie模式,返回值为Cookie            HttpCookie cookie;            if (Request.Cookies[REFRESH_TICKET_NAME] == null)            {                cookie = new HttpCookie(REFRESH_TICKET_NAME);                Response.AppendCookie(cookie);                log.Debug("Cookie不存在,初始化");            }            else            {                cookie = Request.Cookies[REFRESH_TICKET_NAME];                log.Debug("读取已存在的Cookie,当前Cookie中存在的记录数为:" + cookie.Values.Count + "具体有如下几条:");                for (int i = 0; i < cookie.Values.Count; i++)                    log.Info("cookie[" + cookie.Values.GetKey(i) + "]:" + cookie.Values[i]);            }            return cookie;            #endregion        }        /// <summary>        /// 获取当前提交时间        /// </summary>        /// <returns></returns>        private string GetCurSubmitTime()        {            string submitTime = Request.Params[HIDDEN_FIELD_NAME] == null ? "" : Request.Params[HIDDEN_FIELD_NAME].ToString();            log.Debug("执行GetCurSubmitTime:submitTime为:" + submitTime);            return submitTime;        }        /// <summary>        /// 设置页面唯一标识,通过Guid标识来区分每个页面自己的提交时间        /// </summary>        private string SetCurPageGuid()        {            string guid;            if (!IsPostBack)            {                if (Request.Params[HIDDEN_PAGE_GUID] == null)                {                    guid = System.Guid.NewGuid().ToString();                    log.Debug("SetCurPageGuid注册了一个新的标识:" + guid);                }                else                    guid = GetCurPageGuid();            }            else            {                guid = GetCurPageGuid();                           }            ClientScript.RegisterHiddenField(HIDDEN_PAGE_GUID, guid);            return guid;        }         /// <summary>        /// 得到当前页面的唯一标识        /// </summary>        /// <returns></returns>        private string GetCurPageGuid()        {            string pageGuid = Request.Params[HIDDEN_PAGE_GUID] == null ? "none" : Request.Params[HIDDEN_PAGE_GUID].ToString();            log.Debug("执行GetCurPageGuid()后Page_GUID为:" + pageGuid);            return pageGuid;        }需要刷新判断功能时新页面只需继承该类就可,通过引用属性IsPageRefreshed识别"为真表示刷新,假则是正常提交",将数据库的操作写在if(!IsPageRefreshed){   数据库操作}即可,如果是刷新不会执行,代码中注释部分使用的是Session方式保存票证,因为session比较容易丢失且占内存,所以使用cookie,
  相关解决方案