`
冷寒冰
  • 浏览: 243192 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

.net 防止刷新重复提交

阅读更多
http://www.cnblogs.com/madehua/archive/2009/03/23/1420052.html



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;
        }
}




999999999999999999999999999999999999999999999999
需要刷新判断功能时新页面只需继承该类就可,通过引用属性IsPageRefreshed识别"为真表示刷新,假则是正常提交",将数据库的操作写在
if(!IsPageRefreshed)
{
   数据库操作
}
分享到:
评论

相关推荐

    ASP.NET中防止刷新页面造成表单重复提交

    ASP.NET中防止刷新页面造成表单重复提交

    Asp.Net防止刷新重复提交数据的办法

    在网上搜 一下,可以找到很多关于这方面的资料,其中有一篇是来自MSDN上的一种解决方法: ...网上最多的解决此类问题的方法就是不保存缓存,即提交后表单上的数据不会被浏览器的缓存保存,如果此时

    Asp.net防重复提交机制实现方法

    为Button或其他控件加上下面两个属性即可1.UseSubmitBehavior=”false”使用服务器端提交机制,即执行OnClick事件。 2.OnClientClick客户端点击按钮后,设置控件为不可用,控件文本显示处理中…,待服务器端执行完...

    asp.net防止刷新时重复提交(可禁用工具条刷新按钮)

    前段时间遇到了需要禁用刷新的需求,f5按钮就不说了,简单的js就能把它禁用,但是工具条上的刷新按钮却防止不了啊,不过本文介绍的一种方法却可以解决此问题,感兴趣的朋友可以了解下啊,希望本文对你有所帮助

    防止表单重复提交(asp.net )

    防止表单重复提交。判断是新打开的页面还是刷新的页面 判断是新打开的页面还是刷新的页面

    防止页面的重复提交和刷新

    防止页面的重复提交和刷新,详细实例和注解

    菜干ASP.NET防刷新控件 v1.1

    《菜干ASP.NET防刷新控件》用于防止用户向页面后台提交表单等数据后,误操作刷新页面导致数据重复提交,能应用与C#.net的winform或webform,只需要简单的引用就可避免编写大量的语句来实现该功能。 引用步骤: 1、...

    ASP.NET中防止页面刷新造成表单重复提交执行两次操作

    之前看过别人防刷新的方法,是让页面刷新或...在提交表单时,判断表单中提交上来的Hidden和Session中的标志是否一致,就可以知道是正常的提交表单,还是刷新页面导致的重复提交。需要注意的是,在每次提交表单的处理

    .NET 刷新页面防止表单二次提交的实现方法

    1、页面上按钮是服务器控件,现在刷新页面要防止按钮事件重复执行 您可能感兴趣的文章:ASP.NET中防止页面刷新造成表单重复提交执行两次操作asp.net 处理F5刷新页面重复提交页面的一个思路

    ASP.NET防止页面刷新的两种解决方法小结

    第二方法: SubmitOncePage:解决刷新页面造成的数据重复提交问题(网上资料) 执行过postback操作的web页面在刷新的时候,浏览器会有“不重新发送信息,则无法刷新网页”的提示,若刚刚执行的恰好是往数据

    asp.net知识库

    SubmitOncePage:解决刷新页面造成的数据重复提交问题 SharpRewriter:javascript + xml技术利用#实现url重定向 采用XHTML和CSS设计可重用可换肤的WEB站点 asp.net的网址重定向方法的比较:面向搜索引擎友好 也谈 ...

    GOODTEXT.ORG无刷新评论留言本 v2.2.rar

    3、可以设置留言时间间隔,防止重复留言、灌水等,默认30秒 4、可设置是否禁止站外提交 5、可设置是否审核留言 6、管理员可以回复留言 7、gravatar头像地址设置,'gravatar头像被墙无法显示可以换个地址试试 8...

    We7 CMS 2.8.2 32位安装包.zip

    We7 CMS基于.net技术的功能强大、操作简单、开放源码的新一代企业级CMS内容管理系统。国内第一家采用开放插件机制的开源CMS,国内第一家全拖拽模板设计的开源CMS,国内第一家内容模型可拖拽定义的开源CMS。 We7 ...

    GOODTEXT.ORG留言本 v2.3.rar

    3、可以设置留言时间间隔,防止重复留言、灌水等,默认30秒 4、可设置是否禁止站外提交 5、可设置是否审核留言 6、管理员可以回复留言 7、gravatar头像地址设置,gravatar头像被墙无法显示可以换个地址试试 8、...

    GOODTEXT.ORG留言本 2.3.rar

    3、可以设置留言时间间隔,防止重复留言、灌水等,默认30秒 4、可设置是否禁止站外提交 5、可设置是否审核留言 6、管理员可以回复留言 7、gravatar头像地址设置,'gravatar头像被墙无法显示可以换个地址试试 8...

Global site tag (gtag.js) - Google Analytics