`
冷寒冰
  • 浏览: 252624 次
  • 性别: 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中防止刷新页面造成表单重复提交 在Web应用程序开发中,特别是在使用ASP.NET进行网站构建时,一个常见的问题是表单重复提交。这通常发生在用户通过按下浏览器的F5键来刷新页面的情况下,此时之前的表单...

    asp.net 页面防止重复提交

    然而,这种方法并不能完全防止所有情况下的重复提交,因为某些用户可能使用浏览器的刷新功能或者在网络延迟后多次点击。 ASP.NET MVC框架提供了一些内置机制来处理此问题。例如,可以使用`AntiForgeryToken`辅助...

    Asp.net刷新重复提交

    在ASP.NET web应用程序中,"刷新重复提交"是一个常见的问题,它发生在用户点击浏览器...总的来说,理解和掌握防止ASP.NET刷新重复提交的方法对于构建健壮的Web应用至关重要,因为它直接关系到数据的安全性和用户体验。

    VB.NET实现网页禁止重复提交

    在VB.NET中,防止网页重复提交是一个重要的议题,特别是在处理敏感数据或执行关键操作时,重复提交可能导致数据不一致或系统资源浪费。本教程将详细解释如何通过多种方法实现这一功能,结合提供的源码,我们可以深入...

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

    在ASP.NET web应用程序...综上所述,防止表单重复提交是保证ASP.NET应用数据完整性的重要一环。通过综合运用服务器端和客户端的验证机制,以及区分新打开页面和刷新页面的策略,我们可以构建更健壮、更安全的Web应用。

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

    在***应用开发中,防止用户在表单提交后通过刷新页面造成数据的重复提交是一个常见的需求,特别是当用户通过浏览器工具栏的刷新按钮触发页面刷新时。尽管可以通过JavaScript禁用F5快捷键来防止一部分重复提交,但这...

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

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

    asp.net防止页面刷新的办法

    以下将详细探讨几种在ASP.NET中防止页面刷新导致重复提交的方法: ### 1. 使用转向页面语句 这是最直接且广泛使用的方法,它可以通过服务器端或客户端脚本来实现。 #### 服务器端转向 使用`Response.Redirect...

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

    ### 防止页面的重复提交和刷新 #### 一、引言 在现代Web应用开发过程中,确保数据完整性与用户体验至关重要。其中,“防止页面的重复提交和刷新”这一问题尤为关键,它不仅关系到系统的稳定性,还直接影响用户体验...

    asp.net页面防止重复提交示例分享

    为了防止页面刷新之后,用户再次点击按钮造成重复提交,页面刷新前应当将重要状态保存至服务器端或通过其他方式维持状态,例如使用服务器端的Session变量或者数据库记录,保证即使页面刷新,状态也能被正确地维护。...

    Asp.net 页面刷新问题

    本方案通过使用`Session`对象和随机字符串来有效防止用户重复提交数据,解决了ASP.NET页面刷新问题。这种方法简单易行,适用于大多数需要防止重复提交的应用场景。开发者可以根据实际需求调整随机字符串的生成规则和...

    防止刷新后退重复提交

    针对这个问题,我们可以采取多种策略来防止刷新后退时的重复提交。以下是针对"防止刷新后退重复提交"这一主题的详细知识点: 1. **令牌(Token)技术**: 服务器在处理表单提交前,生成一个唯一的令牌(Token),...

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

    另外,如果不需要保留页面状态,完成数据提交后,可以重定向到当前页面,这样也能有效防止刷新导致的重复提交。 在实际应用中,这两种方法都有其适用场景。第一种方法适用于简单的页面,只需要阻止页面被缓存即可;...

    Asp.net 防止提交相关(bing)

    在ASP.NET开发中,防止重提交(也称为双重提交或重复提交)是一个重要的问题,它涉及到用户可能在页面刷新或网络延迟时意外地多次提交相同的数据。这可能导致数据不一致性和逻辑错误。本文将深入探讨如何在ASP.NET...

    asp.net 防止用户通过后退按钮重复提交表单

    在ASP.NET开发中,防止用户通过浏览器的后退按钮重复提交表单是一个常见的问题,因为这可能导致数据的不一致性和数据库的错误。以下是一些防止这种情况的方法和相关的知识点: 1. **利用HTTP响应头控制缓存** - `...

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

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

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

    综上所述,通过在Session中存储并检查Token的方法,我们可以有效防止用户刷新页面导致的表单重复提交问题。这种方法简单易行,且不需要客户端的支持,仅依赖服务器端的会话管理机制。在实现时,应确保Token的安全性...

    ASP.Net中防止刷新自动触发事件的解决方案

    ### ASP.Net中防止刷新自动触发事件的解决方案 #### 背景与问题描述 在ASP.NET Web应用程序开发过程中,一个常见的问题是当用户刷新页面时,可能会导致某些服务器端事件被重复触发。例如,在一个注册页面中,用户...

Global site tag (gtag.js) - Google Analytics